diff --git a/.env.example b/.env.example index e69de29..dd98308 100644 --- a/.env.example +++ b/.env.example @@ -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 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3f419da..136bed3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ out/ .env .env.local .env.*.local +deployments/ +broadcast/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..87eadd3 --- /dev/null +++ b/Makefile @@ -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) \ No newline at end of file diff --git a/broadcast/Deploy.s.sol/84532/run-1777587586850.json b/broadcast/Deploy.s.sol/84532/run-1777587586850.json new file mode 100644 index 0000000..d7bd92f --- /dev/null +++ b/broadcast/Deploy.s.sol/84532/run-1777587586850.json @@ -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" +} \ No newline at end of file