forked from EvergreenCrypto/docker-finance
client/container: ethereum-based: support Etherscan V2, add more L2 chains
- Implements support for unified API via Etherscan V2 (ethereum-based)
* All ethereum-based L2s are now accessed via single API endpoint
- Chains are now available via chain ID
* Updates API key requirement for `fetch` ethereum-based subaccounts
- The API key's value must now be prepended with "etherscan"
* Previously was prepended per-chain ("ethereum" or "polygon")
- The API key is now *required* (can be generated at etherscan.io)
* Resolves fatal error in Etherscan::parse_response()
* Impl will now handle if:
- Config's API key/value is malformed
- Etherscan API key was not given
- Etherscan response is fatal
- Adds support for more L2s
* Arbitrum (One)
* Optimism
* Base
- Adds more L2s to existing accounts
* Coinbase Wallet
* Ledger Live
* MetaMask
- Updates documentation
* Update default generated `fetch` config
* Update `fetch` usage help
* Update README
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
// docker-finance | modern accounting for the power-user
|
||||
//
|
||||
// Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
// Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
@@ -68,6 +68,7 @@ namespace docker_finance\blockchains
|
||||
utils\CLI::throw_fatal('invalid metadata. Did you give accurate account information (account exists? is mispelled?)?');
|
||||
}
|
||||
}
|
||||
|
||||
$metadata->set_blockchain($parsed_metadata[0]);
|
||||
$metadata->set_subaccount($parsed_metadata[1]);
|
||||
$metadata->set_address($parsed_metadata[2]);
|
||||
@@ -99,7 +100,12 @@ namespace docker_finance\blockchains
|
||||
$metadata->set_account(array_pop($head_end));
|
||||
$metadata->set_out_dir($out_dir);
|
||||
|
||||
// Set blockchain API key (blockchain scanning). NOTE: one key per chain, per account
|
||||
/**
|
||||
* Set blockchain API key (blockchain scanning).
|
||||
*
|
||||
* Expects one key per chain (per account), except for
|
||||
* ethereum-based chains (which only expects one key for all chains).
|
||||
*/
|
||||
$metadata->set_api_key(''); // Initialize to prevent fatal error
|
||||
if (str_contains($this->get_env()->get_env('API_KEY'), '/')) {
|
||||
$key_entries = explode(',', $this->get_env()->get_env('API_KEY'));
|
||||
@@ -107,8 +113,22 @@ namespace docker_finance\blockchains
|
||||
$api_blockchain = explode('/', $entry)[0];
|
||||
$api_key = explode('/', $entry)[1];
|
||||
|
||||
if ($api_blockchain == $metadata->get_blockchain()) {
|
||||
$metadata->set_api_key($api_key);
|
||||
if (empty($api_key)) {
|
||||
utils\CLI::throw_fatal("no blockchain API key value");
|
||||
}
|
||||
|
||||
if (!empty($api_blockchain)) {
|
||||
switch ($api_blockchain) {
|
||||
// TODO: WARNING: if adding non-ethereum-based chain, update as needed.
|
||||
case 'algorand':
|
||||
case 'etherscan':
|
||||
case 'tezos':
|
||||
$metadata->set_api_key($api_key);
|
||||
break;
|
||||
default:
|
||||
utils\CLI::throw_fatal("invalid blockchain API");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,7 +140,10 @@ namespace docker_finance\blockchains
|
||||
|
||||
// API factory
|
||||
switch ($metadata->get_blockchain()) {
|
||||
case 'arbitrum':
|
||||
case 'base':
|
||||
case 'ethereum':
|
||||
case 'optimism':
|
||||
case 'polygon':
|
||||
$this->api = new internal\blockchains\Ethereum($this->get_env());
|
||||
break;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
// docker-finance | modern accounting for the power-user
|
||||
//
|
||||
// Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
// Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
@@ -228,8 +228,9 @@ namespace docker_finance\blockchains\internal
|
||||
|
||||
$file = $out_dir . '/' . $metadata->get_address();
|
||||
|
||||
// If contract type needed, then append type
|
||||
if ($metadata->get_blockchain() == 'ethereum' || $metadata->get_blockchain() == 'polygon') {
|
||||
// If ethereum-based contract type is needed, append contract type.
|
||||
// TODO: WARNING: if adding non-ethereum-based chain, update as needed.
|
||||
if ($metadata->get_blockchain() != 'algorand' && $metadata->get_blockchain() != 'tezos') {
|
||||
$file = $out_dir . '/' . $metadata->get_address() . '-' . $metadata->get_contract_type();
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
// docker-finance | modern accounting for the power-user
|
||||
//
|
||||
// Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
// Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
@@ -95,7 +95,11 @@ namespace docker_finance\blockchains\internal\blockchains\ethereum
|
||||
//! @brief Implements response handler
|
||||
public function get_response(internal\Metadata $metadata): mixed
|
||||
{
|
||||
return json_decode($this->request($metadata->get_url()), true, 512, JSON_PRETTY_PRINT)['result'];
|
||||
$response = json_decode($this->request($metadata->get_url()), true, 512, JSON_PRETTY_PRINT)['result'];
|
||||
if (is_string($response)) {
|
||||
utils\CLI::throw_fatal($response);
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
//! @brief Implements parser
|
||||
@@ -149,13 +153,16 @@ namespace docker_finance\blockchains\internal\blockchains\ethereum
|
||||
switch ($contract_type) {
|
||||
case 'normal':
|
||||
switch ($blockchain) {
|
||||
case 'arbitrum':
|
||||
case 'base':
|
||||
case 'ethereum':
|
||||
case 'optimism':
|
||||
$token_name = 'Ethereum';
|
||||
$symbol = 'ETH';
|
||||
break;
|
||||
case 'polygon':
|
||||
$token_name = 'Polygon';
|
||||
$symbol = 'MATIC';
|
||||
$symbol = 'MATIC'; // TODO: update to POL along with mockups
|
||||
break;
|
||||
default:
|
||||
utils\CLI::throw_fatal('Unsupported subaccount name/network');
|
||||
@@ -171,11 +178,14 @@ namespace docker_finance\blockchains\internal\blockchains\ethereum
|
||||
$token_name = 'INTERNAL'; // TODO: contract address / symbol from parent tx would be needed
|
||||
$contract_address = '';
|
||||
switch ($blockchain) {
|
||||
case 'arbitrum':
|
||||
case 'base':
|
||||
case 'ethereum':
|
||||
case 'optimism':
|
||||
$symbol = 'ETH';
|
||||
break;
|
||||
case 'polygon':
|
||||
$symbol = 'MATIC';
|
||||
$symbol = 'MATIC'; // TODO: update to POL along with mockups
|
||||
break;
|
||||
default:
|
||||
utils\CLI::throw_fatal('Unsupported subaccount name/network');
|
||||
@@ -254,18 +264,32 @@ namespace docker_finance\blockchains\internal\blockchains\ethereum
|
||||
public function write_transactions(internal\Metadata $metadata): void
|
||||
{
|
||||
switch ($metadata->get_blockchain()) {
|
||||
case 'ethereum':
|
||||
$domain = 'api.etherscan.io';
|
||||
// Arbitrum One Mainnet
|
||||
case 'arbitrum':
|
||||
$chain_id = 42161;
|
||||
break;
|
||||
// Base Mainnet
|
||||
case 'base':
|
||||
$chain_id = 8453;
|
||||
break;
|
||||
// Ethereum Mainnet
|
||||
case 'ethereum':
|
||||
$chain_id = 1;
|
||||
break;
|
||||
// OP Mainnet
|
||||
case 'optimism':
|
||||
$chain_id = 10;
|
||||
break;
|
||||
// Polygon Mainnet
|
||||
case 'polygon':
|
||||
$domain = 'api.polygonscan.com';
|
||||
$chain_id = 137;
|
||||
break;
|
||||
default:
|
||||
utils\CLI::throw_fatal('invalid type: ' . $metadata->get_blockchain());
|
||||
break;
|
||||
}
|
||||
|
||||
assert(!empty($domain));
|
||||
assert(!empty($chain_id));
|
||||
$address = $metadata->get_address();
|
||||
$api_key = $metadata->get_api_key();
|
||||
|
||||
@@ -277,7 +301,7 @@ namespace docker_finance\blockchains\internal\blockchains\ethereum
|
||||
'erc-1155' => 'token1155tx');
|
||||
|
||||
foreach ($request as $type => $action) {
|
||||
$metadata->set_url("https://{$domain}/api?module=account&action={$action}&address={$address}&startblock=0&endblock=999999999&sort=asc&apiKey={$api_key}");
|
||||
$metadata->set_url("https://api.etherscan.io/v2/api?chainId={$chain_id}&module=account&action={$action}&address={$address}&startblock=0&endblock=999999999&sort=asc&apiKey={$api_key}");
|
||||
$metadata->set_contract_type($type);
|
||||
$response = $this->parse_response($metadata, $this->get_response($metadata));
|
||||
if (!empty($response)) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
# Copyright (C) 2021-2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -67,9 +67,19 @@ function lib_fetch::__parse_args()
|
||||
|
||||
api${global_arg_delim_2}<mobula|coingecko>
|
||||
|
||||
Support account(s):
|
||||
Account(s):
|
||||
|
||||
account${global_arg_delim_2}<coinbase|coinbase-wallet|coinomi|gemini|ledger|metamask|pera-wallet>
|
||||
account${global_arg_delim_2}<account1${global_arg_delim_3}account2${global_arg_delim_3}...>
|
||||
|
||||
Supported account(s):
|
||||
|
||||
- coinbase
|
||||
- coinbase-wallet
|
||||
- coinomi
|
||||
- gemini
|
||||
- ledger
|
||||
- metamask
|
||||
- pera-wallet
|
||||
|
||||
Fetch year:
|
||||
|
||||
@@ -79,6 +89,15 @@ function lib_fetch::__parse_args()
|
||||
|
||||
(block)chain${global_arg_delim_2}<blockchain[${global_arg_delim_3}blockchain${global_arg_delim_1}subaccount]>
|
||||
|
||||
Supported blockchain(s):
|
||||
|
||||
- algorand
|
||||
- arbitrum
|
||||
- base
|
||||
- ethereum
|
||||
- optimism
|
||||
- tezos
|
||||
|
||||
Tor (proxy):
|
||||
|
||||
tor${global_arg_delim_2}<{on|true}|{off|false}> (default 'off')
|
||||
@@ -129,20 +148,20 @@ function lib_fetch::__parse_args()
|
||||
\e[37;2m# Fetch ethereum/polygon subaccounts for account metamask, year 2022\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}metamask blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}polygon year${global_arg_delim_2}2022
|
||||
|
||||
\e[37;2m# Fetch multiple blockchains' subaccounts for account ledger, and ethereum for metamask, year 2023\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}ledger${global_arg_delim_3}metamask blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}tezos${global_arg_delim_3}algorand year${global_arg_delim_2}2023
|
||||
\e[37;2m# Fetch multiple blockchains' subaccounts for account ledger and metamask, year 2023\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}ledger${global_arg_delim_3}metamask blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}base${global_arg_delim_3}tezos${global_arg_delim_3}algorand year${global_arg_delim_2}2023
|
||||
|
||||
\e[37;2m# Same as previous command but with shorthand option 'chain'\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}ledger${global_arg_delim_3}metamask chain${global_arg_delim_2}ethereum${global_arg_delim_3}tezos${global_arg_delim_3}algorand year${global_arg_delim_2}2023
|
||||
$ $global_usage account${global_arg_delim_2}ledger${global_arg_delim_3}metamask chain${global_arg_delim_2}ethereum${global_arg_delim_3}base${global_arg_delim_3}tezos${global_arg_delim_3}algorand year${global_arg_delim_2}2023
|
||||
|
||||
\e[37;2m# Fetch multiple blockchains/subaccounts for ledger\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}ledger chain${global_arg_delim_2}ethereum/nano:x-1${global_arg_delim_3}tezos${global_arg_delim_1}nano:s-plus${global_arg_delim_3}algorand${global_arg_delim_1}nano:x-2
|
||||
|
||||
\e[37;2m# Fetch specific blockchain/subaccount/address for metamask\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}metamask chain${global_arg_delim_2}ethereum/phone:wallet-1/0x236ba53B56FEE4901cdac3170D17f827DF43E969
|
||||
$ $global_usage account${global_arg_delim_2}metamask chain${global_arg_delim_2}ethereum/phone:wallet-1/0x236ba53B56FEE4901cdac3170D17f827DF43E969${global_arg_delim_3}optimism/phone:wallet-3/0x18BFAa3f9Fa06123985d0456b4a911730382009D
|
||||
|
||||
\e[37;2m# Fetch given blochchain-based subaccounts for current year, over the Tor network\e[0m
|
||||
$ $global_usage account${global_arg_delim_2}metamask${global_arg_delim_3}ledger blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}polygon${global_arg_delim_3}tezos${global_arg_delim_3}algorand tor${global_arg_delim_2}on
|
||||
$ $global_usage account${global_arg_delim_2}metamask${global_arg_delim_3}ledger blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}polygon${global_arg_delim_3}arbitrum${global_arg_delim_3}tezos${global_arg_delim_3}algorand tor${global_arg_delim_2}on
|
||||
|
||||
\e[32mNotes:\e[0m
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ if %direction ^OUT$
|
||||
# at times, send to the contract address for certain end-user addresses. So,
|
||||
# reports will produce a double-spend unless this is corrected here.
|
||||
if %direction ^OUT$
|
||||
& %blockchain (^ethereum$|^polygon$)
|
||||
& %blockchain (^ethereum$|^polygon$|^arbitrum$|^base$|^optimism$)
|
||||
& %type ^normal$
|
||||
& %fees [1-9]
|
||||
account3 assets:%account_name:%subaccount_name:%blockchain:%symbol
|
||||
@@ -69,7 +69,7 @@ if %direction ^OUT$
|
||||
|
||||
# Remove 0 value txs (or else journal is cluttered). These should appear for FEE spends only
|
||||
if %direction ^OUT$
|
||||
& %blockchain (^ethereum$|^polygon$)
|
||||
& %blockchain (^ethereum$|^polygon$|^arbitrum$|^base$|^optimism$)
|
||||
& %amount_ ^[^1-9]*$
|
||||
account1
|
||||
account2
|
||||
@@ -99,6 +99,8 @@ if %to_address ^0x401f6c983ea34274ec46f84d70b31c151321188b$
|
||||
|
||||
# NOTE: No ERC-20 txs here for WETH... all "normal" or "internal"
|
||||
|
||||
# TODO: on all supported chains
|
||||
|
||||
# BUY
|
||||
if %to_address ^0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2$
|
||||
& %blockchain ^ethereum$
|
||||
@@ -169,6 +171,8 @@ if %to_address ^0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2$
|
||||
# Swapping #
|
||||
# ---------------------------------------------------------------------------- #
|
||||
|
||||
# TODO: on all supported chains
|
||||
|
||||
include ./rules.d/swap.d/1inch.rules
|
||||
include ./rules.d/swap.d/airswap.rules
|
||||
include ./rules.d/swap.d/metamask.rules
|
||||
@@ -178,6 +182,8 @@ include ./rules.d/swap.d/uniswap.rules
|
||||
# Lending #
|
||||
# ---------------------------------------------------------------------------- #
|
||||
|
||||
# TODO: on all supported chains
|
||||
|
||||
include ./rules.d/lending.d/aave.rules
|
||||
include ./rules.d/lending.d/compound.rules
|
||||
|
||||
@@ -185,6 +191,8 @@ include ./rules.d/lending.d/compound.rules
|
||||
# Staking #
|
||||
# ---------------------------------------------------------------------------- #
|
||||
|
||||
# TODO: on all supported chains
|
||||
|
||||
include ./rules.d/staking.d/lido.rules
|
||||
include ./rules.d/staking.d/rocket-pool.rules
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
@@ -0,0 +1,20 @@
|
||||
# docker-finance | modern accounting for the power-user
|
||||
#
|
||||
# Copyright (C) 2025 Aaron Fiore (Founder, Evergreen Crypto LLC)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
include ../../ethereum-based-shared.rules
|
||||
|
||||
# vim: sw=2 sts=2 si ai et
|
||||
@@ -0,0 +1 @@
|
||||
../../ethereum-based-shared.bash
|
||||
Reference in New Issue
Block a user