Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
PRIVATE_KEY=
DEPLOYER_PRIVATE_KEY=
ETHERSCAN_API_KEY=https://sepolia.g.alchemy.com/v2/xxxx
BASE_SEPOLIA_RPC_URL=https://base-sepolia.g.alchemy.com/v2/xxxx

TREASURY=

SEPOLIA_USDC=
SEPOLIA_AUSDC=
SEPOLIA_AAVE_POOL=

BASE_SEPOLIA_USDC=
BASE_SEPOLIA_AUSDC=
BASE_SEPOLIA_AAVE_POOL=

FEE_RATE_BPS=500
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ out/
.env
.env.local
.env.*.local
deployments/
broadcast/
170 changes: 170 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
#######################################
# FOUNDry PRO MAKEFILE #
#######################################

.DEFAULT_GOAL := help

#######################################
# CONFIGURATION #
#######################################

include .env

NETWORK ?= anvil
SCRIPT ?= script/Deploy.s.sol:Deploy
CONTRACT ?= src/YieldSaveVault.sol:YieldSaveVault

ANVIL_RPC_URL = http://127.0.0.1:8545
SEPOLIA_RPC_URL ?= $(SEPOLIA_RPC_URL)
MAINNET_RPC_URL ?= $(MAINNET_RPC_URL)
BASE_SEPOLIA_RPC_URL ?= $(BASE_SEPOLIA_RPC_URL)

ETH_CHAIN_ID = 11155111
MAINNET_CHAIN_ID = 1
BASE_SEPOLIA_CHAIN_ID = 84532

#######################################
# HELP MENU #
#######################################

help:
@echo ""
@echo "========== Foundry Makefile =========="
@echo ""
@echo "make build - Compile contracts"
@echo "make test - Run tests"
@echo "make test-verbose - Run tests with verbosity"
@echo "make coverage - Run coverage"
@echo "make gas - Generate gas snapshot"
@echo "make clean - Clean artifacts"
@echo "make format - Format solidity"
@echo ""
@echo "make anvil - Start local anvil node"
@echo ""
@echo "make deploy NETWORK=anvil"
@echo "make deploy NETWORK=sepolia"
@echo "make deploy NETWORK=mainnet"
@echo "make deploy NETWORK=base-sepolia"
@echo ""
@echo "make verify NETWORK=sepolia ADDRESS=0x..."
@echo "make verify NETWORK=mainnet ADDRESS=0x..."
@echo "make verify NETWORK=base-sepolia ADDRESS=0x..."
@echo ""
@echo "======================================="
@echo ""

#######################################
# BASIC DEVELOPMENT #
#######################################

.PHONY: build test test-verbose coverage gas clean format deploy verify fork-test anvil

build:
forge build

test:
forge test

test-verbose:
forge test -vvvv

coverage:
forge coverage

gas:
forge snapshot

format:
forge fmt

clean:
forge clean

#######################################
# LOCAL DEVELOPMENT #
#######################################

anvil:
anvil

#######################################
# DEPLOYMENT LOGIC #
#######################################

deploy:
ifeq ($(NETWORK),anvil)
forge script $(SCRIPT) \
--rpc-url $(ANVIL_RPC_URL) \
--private-key $(PRIVATE_KEY) \
--broadcast
endif

ifeq ($(NETWORK),sepolia)
forge script $(SCRIPT) \
--rpc-url $(SEPOLIA_RPC_URL) \
--private-key $(PRIVATE_KEY) \
--broadcast \
--verify \
--etherscan-api-key $(ETHERSCAN_API_KEY)
endif

ifeq ($(NETWORK),mainnet)
forge script $(SCRIPT) \
--rpc-url $(MAINNET_RPC_URL) \
--private-key $(PRIVATE_KEY) \
--broadcast \
--verify \
--etherscan-api-key $(ETHERSCAN_API_KEY)
endif

ifeq ($(NETWORK),base-sepolia)
forge script $(SCRIPT) \
--rpc-url $(BASE_SEPOLIA_RPC_URL) \
--private-key $(PRIVATE_KEY) \
--broadcast \
--verify \
--verifier blockscout \
--verifier-url https://base-sepolia.blockscout.com/api/ \
--etherscan-api-key $(ETHERSCAN_API_KEY)
endif

#######################################
# CONTRACT VERIFICATION #
#######################################

verify:
ifeq ($(NETWORK),sepolia)
forge verify-contract \
--chain-id $(ETH_CHAIN_ID) \
--etherscan-api-key $(ETHERSCAN_API_KEY) \
$(ADDRESS) \
$(CONTRACT)
endif

ifeq ($(NETWORK),mainnet)
forge verify-contract \
--chain-id $(MAINNET_CHAIN_ID) \
--etherscan-api-key $(ETHERSCAN_API_KEY) \
$(ADDRESS) \
$(CONTRACT)
endif

ifeq ($(NETWORK),base-sepolia)
forge verify-contract \
--chain-id $(BASE_SEPOLIA_CHAIN_ID) \
--verifier blockscout \
--verifier-url https://base-sepolia.blockscout.com/api/ \
--etherscan-api-key $(ETHERSCAN_API_KEY) \
$(ADDRESS) \
$(CONTRACT)
endif

#######################################
# FORK TESTING #
#######################################

fork-test:
forge test --fork-url $(SEPOLIA_RPC_URL)

fork-base:
forge test --fork-url $(BASE_SEPOLIA_RPC_URL)
65 changes: 65 additions & 0 deletions broadcast/Deploy.s.sol/84532/run-1777587586850.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
{
"transactions": [
{
"hash": "0x896c86a240b673010cb98c61a22037227fa749c6108ae3a3f7fd7b44df900bfc",
"transactionType": "CREATE",
"contractName": "YieldSaveVault",
"contractAddress": "0x01a991c5b234211390613acc2be1104037600106",
"function": null,
"arguments": [
"0xba50Cd2A20f6DA35D788639E581bca8d0B5d4D5f",
"0x10F1A9D11CDf50041f3f8cB7191CBE2f31750ACC",
"0x8bAB6d1b75f19e9eD9fCe8b9BD338844fF79aE27",
"0xABf89a4Ae1aBf1690CeEec52Eb4d404586aeDA40",
"500"
],
"transaction": {
"from": "0xabf89a4ae1abf1690ceeec52eb4d404586aeda40",
"gas": "0x12609a",
"value": "0x0",
"input": "0x610120604052348015610010575f5ffd5b5060405161115138038061115183398101604081905261002f91610119565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b038516158061007057506001600160a01b038416155b8061008257506001600160a01b038316155b8061009457506001600160a01b038216155b156100b25760405163d92e233d60e01b815260040160405180910390fd5b6103e88111156100d557604051630adad23360e31b815260040160405180910390fd5b6001600160a01b0394851660805292841660a05290831660c05290911660e05261010052610173565b80516001600160a01b0381168114610114575f5ffd5b919050565b5f5f5f5f5f60a0868803121561012d575f5ffd5b610136866100fe565b9450610144602087016100fe565b9350610152604087016100fe565b9250610160606087016100fe565b9150608086015190509295509295909350565b60805160a05160c05160e05161010051610f4d6102045f395f818161020f015261099901525f81816101c101526104df01525f81816102360152818161041d0152818161065801526106cf01525f81816101e801526108ba01525f818161016f015281816103e80152818161048d015281816104be0152818161060b0152818161063701526106940152610f4d5ff3fe608060405234801561000f575f5ffd5b5060043610610106575f3560e01c8063978bbdb91161009e578063d55be8c61161006e578063d55be8c614610299578063de69b3aa146102a2578063e1a45218146102c1578063ed12e8ef146102ca578063ef8b30f7146102d2575f5ffd5b8063978bbdb91461020a578063a03e4bc314610231578063b6b55f2514610258578063c8faf1b81461026b575f5ffd5b80633e413bee116100d95780633e413bee1461016a57806347734892146101a957806361d027b3146101bc57806365196e1e146101e3575f5ffd5b80630a28a4771461010a5780630ba36dcd146101305780632e1a7d4d1461014f5780633a98ef3914610162575b5f5ffd5b61011d610118366004610dcd565b6102e5565b6040519081526020015b60405180910390f35b61011d61013e366004610dfa565b60026020525f908152604090205481565b61011d61015d366004610dcd565b6102fb565b61011d5f5481565b6101917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610127565b61011d6101b7366004610dfa565b61056d565b6101917f000000000000000000000000000000000000000000000000000000000000000081565b6101917f000000000000000000000000000000000000000000000000000000000000000081565b61011d7f000000000000000000000000000000000000000000000000000000000000000081565b6101917f000000000000000000000000000000000000000000000000000000000000000081565b61011d610266366004610dcd565b6105aa565b61027e610279366004610e13565b6107d5565b60408051938452602084019290925290820152606001610127565b61011d6103e881565b61011d6102b0366004610dfa565b60016020525f908152604090205481565b61011d61271081565b61011d6107f0565b61011d6102e0366004610dcd565b6107fe565b5f5f6102f13384610811565b5090949350505050565b5f610304610888565b815f0361032457604051631f2a200560e01b815260040160405180910390fd5b335f908152600160205260409020548083111561035457604051633999656760e01b815260040160405180910390fd5b5f5f5f61036c33876103646108a3565b5f548861092b565b9194509250905061037d8184610e4f565b94506103898685610e4f565b335f908152600160209081526040808320939093556002905290812080548492906103b5908490610e4f565b92505081905550855f5f8282546103cc9190610e4f565b9091555050604051631a4ca37b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590523060448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064016020604051808303815f875af1158015610463573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104879190610e62565b506104b37f000000000000000000000000000000000000000000000000000000000000000033876109d6565b8015610504576105047f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000836109d6565b60408051878152602081018590529081018290526060810186905233907f94ffd6b85c71b847775c89ef6496b93cee961bdc6ff827fd117f174f06f745ae9060800160405180910390a25050505061056860015f516020610ef85f395f51905f5255565b919050565b6001600160a01b0381165f9081526001602052604081205480820361059457505f92915050565b5f61059f8483610811565b509095945050505050565b5f6105b3610888565b815f036105d357604051631f2a200560e01b815260040160405180910390fd5b6105e4826105df6108a3565b610ac0565b9050805f036106065760405163d6a0a04160e01b815260040160405180910390fd5b6106327f0000000000000000000000000000000000000000000000000000000000000000333085610b06565b61067d7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000084610bf9565b60405163617ba03760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490523060448301525f60648301527f0000000000000000000000000000000000000000000000000000000000000000169063617ba037906084015f604051808303815f87803b158015610710575f5ffd5b505af1158015610722573d5f5f3e3d5ffd5b5050335f9081526001602052604081208054859450909250610745908490610e79565b9091555050335f9081526002602052604081208054849290610768908490610e79565b92505081905550805f5f82825461077f9190610e79565b9091555050604080518381526020810183905233917f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca910160405180910390a261056860015f516020610ef85f395f51905f5255565b5f5f5f6107e28585610811565b919790965090945092505050565b5f6107f96108a3565b905090565b5f61080b826105df6108a3565b92915050565b6001600160a01b0382165f9081526001602052604081205481908190841580610838575080155b8061084257508085115b15610856575f5f5f93509350935050610881565b61086b86866108636108a3565b5f548561092b565b91945090925061087d90508284610e4f565b9350505b9250925092565b610890610d9c565b60025f516020610ef85f395f51905f5255565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610907573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f99190610e62565b5f8080846109398789610e8c565b6109439190610ea3565b6001600160a01b0389165f90815260026020526040902054909350849061096b908990610e8c565b6109759190610ea3565b91505f828411610985575f61098f565b61098f8385610e4f565b90506127106109be7f000000000000000000000000000000000000000000000000000000000000000083610e8c565b6109c89190610ea3565b915050955095509592505050565b6040516001600160a01b038381166024830152604482018390525f91829186169060640160408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b17905251610a2f9190610ec2565b5f604051808303815f865af19150503d805f8114610a68576040519150601f19603f3d011682016040523d82523d5f602084013e610a6d565b606091505b5091509150811580610a9b5750805115801590610a9b575080806020019051810190610a999190610ed8565b155b15610ab95760405163149d96f160e31b815260040160405180910390fd5b5050505050565b5f825f03610acf57505f61080b565b5f541580610adb575081155b15610ae757508161080b565b815f5484610af59190610e8c565b610aff9190610ea3565b9392505050565b6040516001600160a01b0384811660248301528381166044830152606482018390525f91829187169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b17905251610b679190610ec2565b5f604051808303815f865af19150503d805f8114610ba0576040519150601f19603f3d011682016040523d82523d5f602084013e610ba5565b606091505b5091509150811580610bd35750805115801590610bd3575080806020019051810190610bd19190610ed8565b155b15610bf15760405163149d96f160e31b815260040160405180910390fd5b505050505050565b6040516001600160a01b0383811660248301525f6044830181905291829186169060640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610c529190610ec2565b5f604051808303815f865af19150503d805f8114610c8b576040519150601f19603f3d011682016040523d82523d5f602084013e610c90565b606091505b5091509150811580610cbe5750805115801590610cbe575080806020019051810190610cbc9190610ed8565b155b15610cdc5760405163149d96f160e31b815260040160405180910390fd5b6040516001600160a01b0385811660248301526044820185905286169060640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610d319190610ec2565b5f604051808303815f865af19150503d805f8114610d6a576040519150601f19603f3d011682016040523d82523d5f602084013e610d6f565b606091505b509092509050811580610a9b5750805115801590610a9b575080806020019051810190610a999190610ed8565b5f516020610ef85f395f51905f5254600203610dcb57604051633ee5aeb560e01b815260040160405180910390fd5b565b5f60208284031215610ddd575f5ffd5b5035919050565b80356001600160a01b0381168114610568575f5ffd5b5f60208284031215610e0a575f5ffd5b610aff82610de4565b5f5f60408385031215610e24575f5ffd5b610e2d83610de4565b946020939093013593505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561080b5761080b610e3b565b5f60208284031215610e72575f5ffd5b5051919050565b8082018082111561080b5761080b610e3b565b808202811582820484141761080b5761080b610e3b565b5f82610ebd57634e487b7160e01b5f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b5f60208284031215610ee8575f5ffd5b81518015158114610aff575f5ffdfe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220b656bb3c5130915ab923db6fdc0f0d608204e5ee6b1d4d22da32e44523e4a99164736f6c634300081e0033000000000000000000000000ba50cd2a20f6da35d788639e581bca8d0b5d4d5f00000000000000000000000010f1a9d11cdf50041f3f8cb7191cbe2f31750acc0000000000000000000000008bab6d1b75f19e9ed9fce8b9bd338844ff79ae27000000000000000000000000abf89a4ae1abf1690ceeec52eb4d404586aeda4000000000000000000000000000000000000000000000000000000000000001f4",
"nonce": "0x0",
"chainId": "0x14a34"
},
"additionalContracts": [],
"isFixedGasLimit": false
}
],
"receipts": [
{
"status": "0x1",
"cumulativeGasUsed": "0x3a8bef",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"type": "0x2",
"transactionHash": "0x896c86a240b673010cb98c61a22037227fa749c6108ae3a3f7fd7b44df900bfc",
"transactionIndex": "0xb",
"blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"blockNumber": "0x2703b4d",
"gasUsed": "0xe22ed",
"effectiveGasPrice": "0x5b8d80",
"blobGasUsed": "0x53f90",
"from": "0xabf89a4ae1abf1690ceeec52eb4d404586aeda40",
"to": null,
"contractAddress": "0x01a991c5b234211390613acc2be1104037600106",
"daFootprintGasScalar": "0x94",
"l1BaseFeeScalar": "0x44d",
"l1BlobBaseFee": "0x8644",
"l1BlobBaseFeeScalar": "0xa118b",
"l1Fee": "0x47ed5ad",
"l1GasPrice": "0x874db",
"l1GasUsed": "0x914b"
}
],
"libraries": [],
"pending": [],
"returns": {
"vault": {
"internal_type": "contract YieldSaveVault",
"value": "0x01a991c5b234211390613acC2be1104037600106"
}
},
"timestamp": 1777587586850,
"chain": 84532,
"commit": "b30e6eb"
}
Loading