From 3ac75c31e12e71b1141c7a2549903d9d1b3542e3 Mon Sep 17 00:00:00 2001 From: Petrovska Date: Wed, 24 Jan 2024 16:59:25 +0300 Subject: [PATCH 1/6] feat: scripts for assoc and treasury council funding --- helpers/addresses.py | 9 +++ .../assoc_and_treasury_council_funding.py | 72 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 scripts/issue/1489/assoc_and_treasury_council_funding.py diff --git a/helpers/addresses.py b/helpers/addresses.py index f3ab3149..97019e25 100644 --- a/helpers/addresses.py +++ b/helpers/addresses.py @@ -142,6 +142,13 @@ "ops_harvester": "0x73433896620E71f7b1C72405b8D2898e951Ca4d5", "ops_external_harvester": "0x64E2286148Fbeba8BEb4613Ede74bAc7646B2A2B", }, + "treasury_councillors": { + "councillor1": "0xc87e98867B392BDBA50FfCfE53014226FE1fAaE7", + "councillor2": "0xae3FB0474841D69AAE9446108F41D01f11E8BeF4", + "councillor3": "0xd1911EEDf284BCD3559de6A06ef67233023e0dFe", + "councillor4": "0x33Dd3EC6CCB2736dc285bde70aADe5C45bFaD588", + "councillor5": "0x3f993093c3917Fe7A117f37cFD008775249f59c8", + }, }, # scout stores prices for all tokens here, either from coingecko or # interpolation. any token here that does not have a coingeco price must be @@ -240,6 +247,7 @@ "GRT": "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", "LIQ": "0xD82fd4D6D62f89A1E50b1db69AD19932314aa408", "LIQLIT": "0x03C6F0Ca0363652398abfb08d154F114e61c4Ad8", + "LUSD": "0x5f98805A4E8be255a32880FDeC7F6728C6568bA0", }, # every slp token listed in treasury tokens above must also be listed here. # the lp_tokens in this list are processed by scount to determine holdings @@ -701,6 +709,7 @@ "quest_board_veliq": "0xcbd27bf506aB5580Ef86Fe6a169449bc24Be471B", }, }, + "llamapay": "0x3E67cc2C7fFf86d9870dB9D02c43e789B52FB296", } ADDRESSES_IBBTC = { diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py new file mode 100644 index 00000000..6776e4c8 --- /dev/null +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -0,0 +1,72 @@ +from great_ape_safe import GreatApeSafe +from helpers.addresses import r + +# flag +PROD = True +COEF = 0.99 +DEADLINE = 60 * 60 * 4 + +# funding figures (treasury) +TREASURY_COUNCIL_YEARLY_FUNDING = 300_000e6 +COUNCILLOR_PAYMENT_COVERED = 2927.777777777777784336e6 + +# funding figure (association) +ASSOC_Q1_FUNDING = 1_154_918 + + +def sell_stable_for_usdc(): + vault = GreatApeSafe(r.badger_wallets.treasury_vault_multisig) + vault.init_cow(prod=PROD) + + # tokens + usdc = vault.contract(r.treasury_tokens.USDC) + dai = vault.contract(r.treasury_tokens.DAI) + lusd = vault.contract(r.treasury_tokens.LUSD) + + # 1. sell $dai for $usdc + vault.cow.market_sell( + asset_sell=dai, + asset_buy=usdc, + mantissa_sell=ASSOC_Q1_FUNDING * 10 ** dai.decimals(), + deadline=DEADLINE, + coef=COEF, + ) + + # 2. sell $lusd (full balance) for $usdc + vault.cow.market_sell( + asset_sell=lusd, + asset_buy=usdc, + mantissa_sell=lusd.balanceOf(vault), + deadline=DEADLINE, + coef=COEF, + ) + + vault.post_safe_tx() + + +def assoc_and_council_funding(): + vault = GreatApeSafe(r.badger_wallets.treasury_vault_multisig) + + # tokens + usdc = vault.contract(r.treasury_tokens.USDC) + + # contracts + llamapay = vault.contract(r.llamapay) + + # 1. transfer funding to assoc. wallet + vault.transfer( + r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING * 10 ** usdc.decimals() + ) + + # 2. top-up yearly funding for treasury council + usdc.approve(llamapay, TREASURY_COUNCIL_YEARLY_FUNDING) + llamapay.deposit(TREASURY_COUNCIL_YEARLY_FUNDING) + + # 3. transfer $usdc to councillors members for covering payment before stream initialisation this month + usdc.transfer(r.treasury_councillors.councillor1, COUNCILLOR_PAYMENT_COVERED) + usdc.transfer(r.treasury_councillors.councillor2, COUNCILLOR_PAYMENT_COVERED) + usdc.transfer(r.treasury_councillors.councillor3, COUNCILLOR_PAYMENT_COVERED) + usdc.transfer(r.treasury_councillors.councillor4, COUNCILLOR_PAYMENT_COVERED) + usdc.transfer(r.treasury_councillors.councillor5, COUNCILLOR_PAYMENT_COVERED) + + vault.post_safe_tx() From 5722969c37745374c22b05ae24e545a85f08b3e9 Mon Sep 17 00:00:00 2001 From: Petrovska Date: Wed, 24 Jan 2024 17:07:03 +0300 Subject: [PATCH 2/6] feat: include $badger transfer --- .../issue/1489/assoc_and_treasury_council_funding.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py index 6776e4c8..9dd28a08 100644 --- a/scripts/issue/1489/assoc_and_treasury_council_funding.py +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -11,7 +11,8 @@ COUNCILLOR_PAYMENT_COVERED = 2927.777777777777784336e6 # funding figure (association) -ASSOC_Q1_FUNDING = 1_154_918 +ASSOC_Q1_FUNDING_STABLES = 1_154_918 +ASSOC_Q1_FUNDING_BADGER = 137_706e18 def sell_stable_for_usdc(): @@ -27,7 +28,7 @@ def sell_stable_for_usdc(): vault.cow.market_sell( asset_sell=dai, asset_buy=usdc, - mantissa_sell=ASSOC_Q1_FUNDING * 10 ** dai.decimals(), + mantissa_sell=ASSOC_Q1_FUNDING_STABLES * 10 ** dai.decimals(), deadline=DEADLINE, coef=COEF, ) @@ -49,14 +50,16 @@ def assoc_and_council_funding(): # tokens usdc = vault.contract(r.treasury_tokens.USDC) + badger = vault.contract(r.treasury_tokens.BADGER) # contracts llamapay = vault.contract(r.llamapay) # 1. transfer funding to assoc. wallet - vault.transfer( - r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING * 10 ** usdc.decimals() + usdc.transfer( + r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING_STABLES * 10 ** usdc.decimals() ) + badger.transfer(r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING_BADGER) # 2. top-up yearly funding for treasury council usdc.approve(llamapay, TREASURY_COUNCIL_YEARLY_FUNDING) From e9f58c7691a078252a90cd85c64cc9a6116d2f8a Mon Sep 17 00:00:00 2001 From: Petrovska Date: Wed, 24 Jan 2024 17:14:30 +0300 Subject: [PATCH 3/6] chores: lint --- scripts/issue/1489/assoc_and_treasury_council_funding.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py index 9dd28a08..bd89423d 100644 --- a/scripts/issue/1489/assoc_and_treasury_council_funding.py +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -57,7 +57,8 @@ def assoc_and_council_funding(): # 1. transfer funding to assoc. wallet usdc.transfer( - r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING_STABLES * 10 ** usdc.decimals() + r.badger_wallets.payments_multisig, + ASSOC_Q1_FUNDING_STABLES * 10 ** usdc.decimals(), ) badger.transfer(r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING_BADGER) From 5915faef731a85016586a68a54e1684c99fc3954 Mon Sep 17 00:00:00 2001 From: Petrovska Date: Wed, 24 Jan 2024 17:46:08 +0300 Subject: [PATCH 4/6] feat: right indentation of the `treasury_councillors` addresses --- .../assoc_and_treasury_council_funding.py | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py index bd89423d..a1d0a760 100644 --- a/scripts/issue/1489/assoc_and_treasury_council_funding.py +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -67,10 +67,20 @@ def assoc_and_council_funding(): llamapay.deposit(TREASURY_COUNCIL_YEARLY_FUNDING) # 3. transfer $usdc to councillors members for covering payment before stream initialisation this month - usdc.transfer(r.treasury_councillors.councillor1, COUNCILLOR_PAYMENT_COVERED) - usdc.transfer(r.treasury_councillors.councillor2, COUNCILLOR_PAYMENT_COVERED) - usdc.transfer(r.treasury_councillors.councillor3, COUNCILLOR_PAYMENT_COVERED) - usdc.transfer(r.treasury_councillors.councillor4, COUNCILLOR_PAYMENT_COVERED) - usdc.transfer(r.treasury_councillors.councillor5, COUNCILLOR_PAYMENT_COVERED) + usdc.transfer( + r.badger_wallets.treasury_councillors.councillor1, COUNCILLOR_PAYMENT_COVERED + ) + usdc.transfer( + r.badger_wallets.treasury_councillors.councillor2, COUNCILLOR_PAYMENT_COVERED + ) + usdc.transfer( + r.badger_wallets.treasury_councillors.councillor3, COUNCILLOR_PAYMENT_COVERED + ) + usdc.transfer( + r.badger_wallets.treasury_councillors.councillor4, COUNCILLOR_PAYMENT_COVERED + ) + usdc.transfer( + r.badger_wallets.treasury_councillors.councillor5, COUNCILLOR_PAYMENT_COVERED + ) vault.post_safe_tx() From fb4d9cbb8ea35b9e321e564981671d47be5e2a75 Mon Sep 17 00:00:00 2001 From: sajanrajdev Date: Wed, 24 Jan 2024 15:44:46 -0700 Subject: [PATCH 5/6] feat: new payments multi --- scripts/issue/1489/assoc_and_treasury_council_funding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py index a1d0a760..b1a9cb00 100644 --- a/scripts/issue/1489/assoc_and_treasury_council_funding.py +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -57,10 +57,10 @@ def assoc_and_council_funding(): # 1. transfer funding to assoc. wallet usdc.transfer( - r.badger_wallets.payments_multisig, + r.badger_wallets.payments_multisig_2024, ASSOC_Q1_FUNDING_STABLES * 10 ** usdc.decimals(), ) - badger.transfer(r.badger_wallets.payments_multisig, ASSOC_Q1_FUNDING_BADGER) + badger.transfer(r.badger_wallets.payments_multisig_2024, ASSOC_Q1_FUNDING_BADGER) # 2. top-up yearly funding for treasury council usdc.approve(llamapay, TREASURY_COUNCIL_YEARLY_FUNDING) From 0057a44d4015419ae2104651771e850116a51b1b Mon Sep 17 00:00:00 2001 From: sajanrajdev Date: Wed, 24 Jan 2024 16:26:51 -0700 Subject: [PATCH 6/6] feat: added sim, assertions and snapshots --- .../assoc_and_treasury_council_funding.py | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/scripts/issue/1489/assoc_and_treasury_council_funding.py b/scripts/issue/1489/assoc_and_treasury_council_funding.py index b1a9cb00..9457d02a 100644 --- a/scripts/issue/1489/assoc_and_treasury_council_funding.py +++ b/scripts/issue/1489/assoc_and_treasury_council_funding.py @@ -1,8 +1,9 @@ from great_ape_safe import GreatApeSafe from helpers.addresses import r +from brownie import accounts # flag -PROD = True +PROD = False COEF = 0.99 DEADLINE = 60 * 60 * 4 @@ -14,6 +15,9 @@ ASSOC_Q1_FUNDING_STABLES = 1_154_918 ASSOC_Q1_FUNDING_BADGER = 137_706e18 +# testing +USDC_WHALE = "0xD6153F5af5679a75cC85D8974463545181f48772" + def sell_stable_for_usdc(): vault = GreatApeSafe(r.badger_wallets.treasury_vault_multisig) @@ -45,26 +49,39 @@ def sell_stable_for_usdc(): vault.post_safe_tx() -def assoc_and_council_funding(): +def assoc_and_council_funding(sim=False): vault = GreatApeSafe(r.badger_wallets.treasury_vault_multisig) + payments = GreatApeSafe(r.badger_wallets.payments_multisig_2024) # tokens usdc = vault.contract(r.treasury_tokens.USDC) badger = vault.contract(r.treasury_tokens.BADGER) + # for testing purposes (USDC acquisition) + if sim: + usdc_whale = accounts.at(USDC_WHALE, force=True) + usdc.transfer(vault.account, 2_000_000e6, {"from": usdc_whale}) + + vault.take_snapshot([usdc, badger]) + payments.take_snapshot([usdc, badger]) + # contracts llamapay = vault.contract(r.llamapay) # 1. transfer funding to assoc. wallet usdc.transfer( - r.badger_wallets.payments_multisig_2024, + payments.account, ASSOC_Q1_FUNDING_STABLES * 10 ** usdc.decimals(), ) - badger.transfer(r.badger_wallets.payments_multisig_2024, ASSOC_Q1_FUNDING_BADGER) + badger.transfer(payments.account, ASSOC_Q1_FUNDING_BADGER) # 2. top-up yearly funding for treasury council usdc.approve(llamapay, TREASURY_COUNCIL_YEARLY_FUNDING) llamapay.deposit(TREASURY_COUNCIL_YEARLY_FUNDING) + # Accounting on LlamaPay is done in 1e20 units (https://etherscan.io/address/0x3e67cc2c7fff86d9870db9d02c43e789b52fb296#code#F1#L218) + assert llamapay.balances( + vault.account + ) / 1e20 == TREASURY_COUNCIL_YEARLY_FUNDING / (10 ** usdc.decimals()) # 3. transfer $usdc to councillors members for covering payment before stream initialisation this month usdc.transfer( @@ -83,4 +100,6 @@ def assoc_and_council_funding(): r.badger_wallets.treasury_councillors.councillor5, COUNCILLOR_PAYMENT_COVERED ) + payments.print_snapshot() + vault.print_snapshot() vault.post_safe_tx()