From ba1ba1ba15d5f165ef4f70d28b90f9d54bfaecfd Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Wed, 27 Nov 2024 19:07:34 -0600 Subject: [PATCH 1/8] parse csv and generate msg hash in review_votes.py --- .../aura_snapshot_voting/review_votes.py | 16 +++++- tools/python/aura_snapshot_voting/vote.py | 54 ++++++++++++------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/tools/python/aura_snapshot_voting/review_votes.py b/tools/python/aura_snapshot_voting/review_votes.py index f8b830523..1ae5c87bf 100644 --- a/tools/python/aura_snapshot_voting/review_votes.py +++ b/tools/python/aura_snapshot_voting/review_votes.py @@ -5,6 +5,7 @@ from pathlib import Path from bal_addresses.utils import to_checksum_address import requests +from vote import prepare_vote_data, create_vote_payload, hash_eip712_message, _get_prop_and_determine_date_range def find_project_root(current_path=None): @@ -55,6 +56,17 @@ def review_votes(week_string): total_allocation = vote_df["Allocation %"].str.rstrip("%").astype(float).sum() allocation_check = abs(total_allocation - 100) < 0.0001 + try: + prop, _, _ = _get_prop_and_determine_date_range() + vote_df, vote_choices = prepare_vote_data(vote_df, prop) + data = create_vote_payload(vote_choices, prop) + hash = hash_eip712_message(data) + vote_prep = f"\n### Vote Preparation\n✅ Successfully simulated vote preparation.\nMessage hash: `0x{hash.hex()}`" + vote_check = True + except Exception as e: + vote_prep = f"\n### Vote Preparation\n❌ Error simulating vote preparation: {str(e)}" + vote_check = False + report = f"""## vLAURA Votes Review CSV file: `{os.path.relpath(csv_file, project_root)}` @@ -68,11 +80,13 @@ def review_votes(week_string): {f"- Missing labels for {len(missing_labels)} gauge(s):" if not snapshot_label_check else ""} {missing_labels[["Chain", "Label", "Gauge Address"]].to_string(index=False) if not snapshot_label_check else ""} +{vote_prep} + ### Vote Summary {vote_df[["Chain", "Label", "Gauge Address", "Allocation %"]].to_markdown(index=False)} -{"### ✅ All checks passed" if (allocation_check and snapshot_label_check) else "### ❌ Some checks failed"} +{"### ✅ All checks passed!" if (allocation_check and snapshot_label_check and vote_check) else "### ❌ Some checks failed - please review the issues above"} """ with open("review_output.md", "w") as f: diff --git a/tools/python/aura_snapshot_voting/vote.py b/tools/python/aura_snapshot_voting/vote.py index 76a3d9f6f..fbd78d44d 100644 --- a/tools/python/aura_snapshot_voting/vote.py +++ b/tools/python/aura_snapshot_voting/vote.py @@ -116,26 +116,8 @@ def create_voting_dirs_for_year(base_path, year, week): f.write("") -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Vote processing script") - parser.add_argument( - "--week-string", - type=str, - help="Date that votes are are being posted. should be YYYY-W##", - ) - year, week = parser.parse_args().week_string.split("-") - - project_root = find_project_root() - base_path = project_root / "MaxiOps/vlaura_voting" - voting_dir = base_path / str(year) / str(week) - input_dir = voting_dir / "input" - output_dir = voting_dir / "output" - - create_voting_dirs_for_year(base_path, year, week) - - vote_df = pd.read_csv(glob.glob(f"{input_dir}/*.csv")[0]) - - prop, _, _ = _get_prop_and_determine_date_range() +def prepare_vote_data(vote_df, prop): + """Prepares and validates vote data, returning the structured payload""" choices = prop["choices"] gauge_labels = fetch_json_from_url(GAUGE_MAPPING_URL) gauge_labels = {to_checksum_address(x["address"]): x["label"] for x in gauge_labels} @@ -155,7 +137,13 @@ def create_voting_dirs_for_year(base_path, year, week): assert vote_df["share"].sum() == approx(100, abs=0.0001) vote_choices = dict(zip(vote_df["snapshot_index"], vote_df["share"])) + + return vote_df, vote_choices + +def create_vote_payload(vote_choices, prop): + """Creates the EIP712 structured data payload""" + project_root = find_project_root() template_path = project_root / "tools/python/aura_snapshot_voting" with open(f"{template_path}/eip712_template.json", "r") as f: data = json.load(f) @@ -165,6 +153,32 @@ def create_voting_dirs_for_year(base_path, year, week): data["message"]["proposal"] = bytes.fromhex(prop["id"][2:]) data["message"]["choice"] = format_choices(vote_choices) + return data + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Vote processing script") + parser.add_argument( + "--week-string", + type=str, + help="Date that votes are are being posted. should be YYYY-W##", + ) + year, week = parser.parse_args().week_string.split("-") + + project_root = find_project_root() + base_path = project_root / "MaxiOps/vlaura_voting" + voting_dir = base_path / str(year) / str(week) + input_dir = voting_dir / "input" + output_dir = voting_dir / "output" + + create_voting_dirs_for_year(base_path, year, week) + + vote_df = pd.read_csv(glob.glob(f"{input_dir}/*.csv")[0]) + + prop, _, _ = _get_prop_and_determine_date_range() + + vote_df, vote_choices = prepare_vote_data(vote_df, prop) + data = create_vote_payload(vote_choices, prop) hash = hash_eip712_message(data) print(f"voting for: \n{vote_df[['Chain', 'snapshot_label', 'share']]}") From ba1ba1ba10b96e05ff4bf014e79f45e87af8d8ae Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Wed, 27 Nov 2024 19:09:42 -0600 Subject: [PATCH 2/8] =?UTF-8?q?move=20=E2=9C=85=20to=20end=20of=20line?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/python/aura_snapshot_voting/review_votes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/python/aura_snapshot_voting/review_votes.py b/tools/python/aura_snapshot_voting/review_votes.py index 1ae5c87bf..517e8d24c 100644 --- a/tools/python/aura_snapshot_voting/review_votes.py +++ b/tools/python/aura_snapshot_voting/review_votes.py @@ -61,7 +61,7 @@ def review_votes(week_string): vote_df, vote_choices = prepare_vote_data(vote_df, prop) data = create_vote_payload(vote_choices, prop) hash = hash_eip712_message(data) - vote_prep = f"\n### Vote Preparation\n✅ Successfully simulated vote preparation.\nMessage hash: `0x{hash.hex()}`" + vote_prep = f"\n### Vote Preparation\nSuccessfully simulated vote preparation ✅\nMessage hash: `0x{hash.hex()}`" vote_check = True except Exception as e: vote_prep = f"\n### Vote Preparation\n❌ Error simulating vote preparation: {str(e)}" From 5327714c9cf048930b0bd5d4c84a4fa21aee64f2 Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jalbrekt85@users.noreply.github.com> Date: Thu, 28 Nov 2024 01:12:22 +0000 Subject: [PATCH 3/8] style: ci lint with `black` --- tools/python/aura_snapshot_voting/review_votes.py | 11 +++++++++-- tools/python/aura_snapshot_voting/vote.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tools/python/aura_snapshot_voting/review_votes.py b/tools/python/aura_snapshot_voting/review_votes.py index 517e8d24c..2b47ad70f 100644 --- a/tools/python/aura_snapshot_voting/review_votes.py +++ b/tools/python/aura_snapshot_voting/review_votes.py @@ -5,7 +5,12 @@ from pathlib import Path from bal_addresses.utils import to_checksum_address import requests -from vote import prepare_vote_data, create_vote_payload, hash_eip712_message, _get_prop_and_determine_date_range +from vote import ( + prepare_vote_data, + create_vote_payload, + hash_eip712_message, + _get_prop_and_determine_date_range, +) def find_project_root(current_path=None): @@ -64,7 +69,9 @@ def review_votes(week_string): vote_prep = f"\n### Vote Preparation\nSuccessfully simulated vote preparation ✅\nMessage hash: `0x{hash.hex()}`" vote_check = True except Exception as e: - vote_prep = f"\n### Vote Preparation\n❌ Error simulating vote preparation: {str(e)}" + vote_prep = ( + f"\n### Vote Preparation\n❌ Error simulating vote preparation: {str(e)}" + ) vote_check = False report = f"""## vLAURA Votes Review diff --git a/tools/python/aura_snapshot_voting/vote.py b/tools/python/aura_snapshot_voting/vote.py index fbd78d44d..acef5ac2b 100644 --- a/tools/python/aura_snapshot_voting/vote.py +++ b/tools/python/aura_snapshot_voting/vote.py @@ -137,7 +137,7 @@ def prepare_vote_data(vote_df, prop): assert vote_df["share"].sum() == approx(100, abs=0.0001) vote_choices = dict(zip(vote_df["snapshot_index"], vote_df["share"])) - + return vote_df, vote_choices From ba1ba1ba1e08b6fe3b3c595d1d2041a326d24554 Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Tue, 3 Dec 2024 16:24:35 -0600 Subject: [PATCH 4/8] add workflow_dispatch --- .../workflows/review_aura_gauge_votes.yaml | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/.github/workflows/review_aura_gauge_votes.yaml b/.github/workflows/review_aura_gauge_votes.yaml index 5aac0472c..b4ef3c3f4 100644 --- a/.github/workflows/review_aura_gauge_votes.yaml +++ b/.github/workflows/review_aura_gauge_votes.yaml @@ -4,6 +4,11 @@ on: pull_request: paths: - 'MaxiOps/vlaura_voting/**/input/*.csv' + workflow_dispatch: + inputs: + week-string: + description: "The week to review like YYYY-W##" + required: true jobs: review_votes: @@ -22,21 +27,25 @@ jobs: - name: Determine week-string id: week-string run: | - # Get the path of the changed CSV file - CSV_PATH=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | grep '/input/.*\.csv$' | head -n 1) - - if [ -z "$CSV_PATH" ]; then - echo "No CSV file found in recent changes." - exit 1 - fi + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "week-string=${{ github.event.inputs.week-string }}" >> $GITHUB_OUTPUT + else + # Get the path of the changed CSV file + CSV_PATH=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | grep '/input/.*\.csv$' | head -n 1) + + if [ -z "$CSV_PATH" ]; then + echo "No CSV file found in recent changes." + exit 1 + fi - echo "CSV Path: $CSV_PATH" - - YEAR=$(echo $CSV_PATH | cut -d'/' -f3) - WEEK=$(echo $CSV_PATH | cut -d'/' -f4) - WEEK_STRING="${YEAR}-${WEEK}" + echo "CSV Path: $CSV_PATH" + + YEAR=$(echo $CSV_PATH | cut -d'/' -f3) + WEEK=$(echo $CSV_PATH | cut -d'/' -f4) + WEEK_STRING="${YEAR}-${WEEK}" - echo "week-string=$WEEK_STRING" >> $GITHUB_OUTPUT + echo "week-string=$WEEK_STRING" >> $GITHUB_OUTPUT + fi - name: Review vLAURA Votes run: | @@ -47,6 +56,7 @@ jobs: python3 $RUN_DIR/review_votes.py --week-string "${{ steps.week-string.outputs.week-string }}" - name: Comment PR + if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: github-token: ${{secrets.GITHUB_TOKEN}} From 7201e7c47a05a081f53bc6631756a7fa67ee12b9 Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Tue, 3 Dec 2024 16:26:43 -0600 Subject: [PATCH 5/8] sample voting data to test --- ...D Vote Template - November 21 2024 (1).csv | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv diff --git a/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv b/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv new file mode 100644 index 000000000..b3b00eaf4 --- /dev/null +++ b/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv @@ -0,0 +1,42 @@ +Chain,Label,Gauge Address,Allocation %, +Mainnet,sDAI/4Pool,0xf6a7ad46b00300344c7d4739c0518db70e722dc4,10.00%,Core Liquidity +Mainnet,GHO/USDC/USDT,0xf720e9137baa9c7612e6ca59149a5057ab320cfa,12.50%, +Arbitrum,sFRAX/4Pool,0x62a82fe26e21a8807599374cac8024fae342ef83,5.00%, +Arbitrum,aUSDC/USDC,0x75ba7f8733c154302cbe2e19fe3ec417e0679833,2.00%, +Optimsim,ECLP-waUSDC-waUSDT,0x1a8F7747cA103d229d7bDFF5f89c176b95Faf301,2.00%, +Arbitrum,aUSDC/aUSDT,0xbb034e493ebf45f874e038ae76576df9cc1137e5,5.50%,37.00% +Mainnet,50wstETH/ACX,0xf7b0751fea697cf1a541a5f57d11058a8fb794ee,5.95%,Revenue +Mainnet,wstETH-wETH-BPT,0x5c0f23a5c1be65fa710d385814a7fd1bda480b1c,6.93%,35.00% +Mainnet,B-rETH-Stable,0x79ef6103a513951a3b25743db509e267685726b7,4.54%, +Mainnet,weETH/rETH,0xC859BF9d7B8C557bBd229565124c2C09269F3aEF,3.85%, +Mainnet,ezETH-wETH,0xa8b309a75f0d64ed632d45a003c68a30e59a1d8b,8.04%, +Mainnet,STG/USDC,0x15C84754c7445D0DF6c613f1490cA07654347c1B,5.69%,35% +,,,,Biz Dev +Mainnet,tETH/wstETH,0xf697535848B535900c76f70F1e36EC3985D27862,5.00%, +Mainnet,cbETH/wstETH,0x655A2B240151b4fAb06dfb2B6329eF72647F89dd,5.00%, +Mainnet,sdeUSD/deUSD,0xA00DB7d9c465e95e4AA814A9340B9A161364470a,5.00%, +Arbitrum,GHO / USDL,0x2e8A05f0216c6cC43BC123EE7dEf58901d3844D2,4.00%, +Base,cbETH/wstETH,0xBDc908e5dF4A95909DD8cbdD5E88C4078a85f7fC,5.00%, +Base,wETH/USDC,0xE01347229d681C69f459176A042268Cf981DFaa4,4.00%, +,,,,28% +,,,,TOTAL +,,,,100.00% +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +,,,, +Total USDC,"$100,000",,, +APY needed,6%,,, +Incentives per 1m,60000,,, +Incentives per wk,"$1,154",,, +Incentives per 6 wks,"$4,615",,, +Total TVL to support,22,,, \ No newline at end of file From 260ba05547184a2f1e4f92c891bc00b2bbb2a022 Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jalbrekt85@users.noreply.github.com> Date: Tue, 3 Dec 2024 22:28:15 +0000 Subject: [PATCH 6/8] Automated processing of Payload PR (validations, transformations, and reports) + reformat JSON --- .../2024/W49/output/payload.json | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/MaxiOps/vlaura_voting/2024/W49/output/payload.json b/MaxiOps/vlaura_voting/2024/W49/output/payload.json index 4d26ecf74..1433196d0 100644 --- a/MaxiOps/vlaura_voting/2024/W49/output/payload.json +++ b/MaxiOps/vlaura_voting/2024/W49/output/payload.json @@ -1,52 +1,52 @@ { - "domain": { - "name": "snapshot", - "version": "0.1.4" - }, - "types": { - "Vote": [ - { - "name": "from", - "type": "address" - }, - { - "name": "space", - "type": "string" - }, - { - "name": "timestamp", - "type": "uint64" - }, - { - "name": "proposal", - "type": "bytes32" - }, - { - "name": "choice", - "type": "string" - }, - { - "name": "reason", - "type": "string" - }, - { - "name": "app", - "type": "string" - }, - { - "name": "metadata", - "type": "string" - } - ] - }, - "message": { - "space": "gauges.aurafinance.eth", - "proposal": "0x2cc46de8f63d957646a1e3132a95056e9274f9277f016b02eb588888bc942a9a", - "choice": "{\"95\":10.0,\"98\":12.5,\"183\":5.0,\"205\":2.0,\"275\":2.0,\"215\":5.5,\"30\":5.95,\"120\":6.93,\"144\":4.54,\"86\":3.85,\"106\":8.04,\"24\":5.69,\"117\":5.0,\"142\":5.0,\"124\":5.0,\"204\":4.0,\"320\":5.0,\"323\":4.0}", - "app": "snapshot", - "reason": "", - "metadata": "{}", - "from": "0x9ff471F9f98F42E5151C7855fD1b5aa906b1AF7e", - "timestamp": 1732479974 - } -} \ No newline at end of file + "domain": { + "name": "snapshot", + "version": "0.1.4" + }, + "types": { + "Vote": [ + { + "name": "from", + "type": "address" + }, + { + "name": "space", + "type": "string" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "proposal", + "type": "bytes32" + }, + { + "name": "choice", + "type": "string" + }, + { + "name": "reason", + "type": "string" + }, + { + "name": "app", + "type": "string" + }, + { + "name": "metadata", + "type": "string" + } + ] + }, + "message": { + "space": "gauges.aurafinance.eth", + "proposal": "0x2cc46de8f63d957646a1e3132a95056e9274f9277f016b02eb588888bc942a9a", + "choice": "{\"95\":10.0,\"98\":12.5,\"183\":5.0,\"205\":2.0,\"275\":2.0,\"215\":5.5,\"30\":5.95,\"120\":6.93,\"144\":4.54,\"86\":3.85,\"106\":8.04,\"24\":5.69,\"117\":5.0,\"142\":5.0,\"124\":5.0,\"204\":4.0,\"320\":5.0,\"323\":4.0}", + "app": "snapshot", + "reason": "", + "metadata": "{}", + "from": "0x9ff471F9f98F42E5151C7855fD1b5aa906b1AF7e", + "timestamp": 1732479974 + } +} From 0000000081aa69356d6fb01ff6635608c23d46cb Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Tue, 3 Dec 2024 16:31:55 -0600 Subject: [PATCH 7/8] rename to maxi_omni --- tools/python/aura_snapshot_voting/vote.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/python/aura_snapshot_voting/vote.py b/tools/python/aura_snapshot_voting/vote.py index acef5ac2b..ba8367f1d 100644 --- a/tools/python/aura_snapshot_voting/vote.py +++ b/tools/python/aura_snapshot_voting/vote.py @@ -41,7 +41,7 @@ GAUGE_SNAPSHOT_URL = "https://raw.githubusercontent.com/aurafinance/aura-contracts/main/tasks/snapshot/gauge_snapshot.json" flatbook = AddrBook("mainnet").flatbook -vlaura_safe_addr = flatbook["multisigs/vote_incentive_recycling"] +vlaura_safe_addr = flatbook["multisigs/maxi_omni"] sign_msg_lib_addr = flatbook["gnosis/sign_message_lib"] Account.enable_unaudited_hdwallet_features() From 11111111da038309a35894ab22df7439e1d6b609 Mon Sep 17 00:00:00 2001 From: jalbrekt85 <jcalbrecht85@gmail.com> Date: Tue, 3 Dec 2024 16:33:38 -0600 Subject: [PATCH 8/8] remove test votes --- ...D Vote Template - November 21 2024 (1).csv | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv diff --git a/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv b/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv deleted file mode 100644 index b3b00eaf4..000000000 --- a/MaxiOps/vlaura_voting/2024/W50/input/BD Vote Template - November 21 2024 (1) - BD Vote Template - November 21 2024 (1).csv +++ /dev/null @@ -1,42 +0,0 @@ -Chain,Label,Gauge Address,Allocation %, -Mainnet,sDAI/4Pool,0xf6a7ad46b00300344c7d4739c0518db70e722dc4,10.00%,Core Liquidity -Mainnet,GHO/USDC/USDT,0xf720e9137baa9c7612e6ca59149a5057ab320cfa,12.50%, -Arbitrum,sFRAX/4Pool,0x62a82fe26e21a8807599374cac8024fae342ef83,5.00%, -Arbitrum,aUSDC/USDC,0x75ba7f8733c154302cbe2e19fe3ec417e0679833,2.00%, -Optimsim,ECLP-waUSDC-waUSDT,0x1a8F7747cA103d229d7bDFF5f89c176b95Faf301,2.00%, -Arbitrum,aUSDC/aUSDT,0xbb034e493ebf45f874e038ae76576df9cc1137e5,5.50%,37.00% -Mainnet,50wstETH/ACX,0xf7b0751fea697cf1a541a5f57d11058a8fb794ee,5.95%,Revenue -Mainnet,wstETH-wETH-BPT,0x5c0f23a5c1be65fa710d385814a7fd1bda480b1c,6.93%,35.00% -Mainnet,B-rETH-Stable,0x79ef6103a513951a3b25743db509e267685726b7,4.54%, -Mainnet,weETH/rETH,0xC859BF9d7B8C557bBd229565124c2C09269F3aEF,3.85%, -Mainnet,ezETH-wETH,0xa8b309a75f0d64ed632d45a003c68a30e59a1d8b,8.04%, -Mainnet,STG/USDC,0x15C84754c7445D0DF6c613f1490cA07654347c1B,5.69%,35% -,,,,Biz Dev -Mainnet,tETH/wstETH,0xf697535848B535900c76f70F1e36EC3985D27862,5.00%, -Mainnet,cbETH/wstETH,0x655A2B240151b4fAb06dfb2B6329eF72647F89dd,5.00%, -Mainnet,sdeUSD/deUSD,0xA00DB7d9c465e95e4AA814A9340B9A161364470a,5.00%, -Arbitrum,GHO / USDL,0x2e8A05f0216c6cC43BC123EE7dEf58901d3844D2,4.00%, -Base,cbETH/wstETH,0xBDc908e5dF4A95909DD8cbdD5E88C4078a85f7fC,5.00%, -Base,wETH/USDC,0xE01347229d681C69f459176A042268Cf981DFaa4,4.00%, -,,,,28% -,,,,TOTAL -,,,,100.00% -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -,,,, -Total USDC,"$100,000",,, -APY needed,6%,,, -Incentives per 1m,60000,,, -Incentives per wk,"$1,154",,, -Incentives per 6 wks,"$4,615",,, -Total TVL to support,22,,, \ No newline at end of file