-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathMakefile
252 lines (198 loc) · 8.52 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
.DEFAULT_TARGET: help
# Import the .env files and export their values (ignore any error if missing)
-include .env
-include .env.test
# RULE SPECIFIC ENV VARS [optional]
# Override the verifier and block explorer parameters (network dependent)
deploy-testnet: export ETHERSCAN_API_KEY_PARAM = --etherscan-api-key $(ETHERSCAN_API_KEY)
deploy-prodnet: export ETHERSCAN_API_KEY_PARAM = --etherscan-api-key $(ETHERSCAN_API_KEY)
# deploy-testnet: export VERIFIER_TYPE_PARAM = --verifier blockscout
# deploy-testnet: export VERIFIER_URL_PARAM = --verifier-url "https://server/api\?"
# CONSTANTS
TEST_COVERAGE_SRC_FILES:=$(wildcard test/*.sol test/**/*.sol src/*.sol src/**/*.sol src/libs/ProxyLib.sol)
DEPLOY_SCRIPT:=script/Deploy.s.sol:Deploy
VERBOSITY:=-vvv
SHELL:=/bin/bash
SOLIDITY_VERSION=0.8.17
TEST_TREE_MARKDOWN=TEST_TREE.md
SOURCE_FILES=$(wildcard test/*.t.yaml test/integration/*.t.yaml)
TREE_FILES = $(SOURCE_FILES:.t.yaml=.tree)
TARGET_TEST_FILES = $(SOURCE_FILES:.tree=.t.sol)
MAKE_TEST_TREE=deno run ./test/script/make-test-tree.ts
MAKEFILE=Makefile
# TARGETS
.PHONY: help
help:
@echo "Available targets:"
@grep -E '^[a-zA-Z0-9_-]*:.*?## .*$$' Makefile \
| sed -n 's/^\(.*\): \(.*\)##\(.*\)/- make \1 \3/p' \
| sed 's/^- make $$//g'
: ##
.PHONY: init
init: .env .env.test ## Check the dependencies and prompt to install if needed
@which deno > /dev/null && echo "Deno is available" || echo "Install Deno: curl -fsSL https://deno.land/install.sh | sh"
@which bulloak > /dev/null && echo "bulloak is available" || echo "Install bulloak: cargo install bulloak"
@which forge > /dev/null || curl -L https://foundry.paradigm.xyz | bash
@forge build
@which lcov > /dev/null || echo "Note: lcov can be installed by running 'sudo apt install lcov'"
.PHONY: clean
clean: ## Clean the build artifacts
rm -f $(TREE_FILES)
rm -f $(TEST_TREE_MARKDOWN)
rm -Rf ./out/* lcov.info* ./report/*
: ##
.PHONY: test
test: ## Run unit tests, locally
forge test $(VERBOSITY)
# forge test --no-match-path $(FORK_TEST_WILDCARD) $(VERBOSITY)
test-coverage: report/index.html ## Generate an HTML coverage report under ./report
@which open > /dev/null && open report/index.html || echo -n
@which xdg-open > /dev/null && xdg-open report/index.html || echo -n
report/index.html: lcov.info.pruned
genhtml $^ -o report --branch-coverage
lcov.info.pruned: lcov.info
lcov --remove $< -o ./$@ $^
lcov.info: $(TEST_COVERAGE_SRC_FILES)
forge coverage --report lcov
# forge coverage --no-match-path $(FORK_TEST_WILDCARD) --report lcov
: ##
sync-tests: $(TREE_FILES) ## Scaffold or sync tree files into solidity tests
@for file in $^; do \
if [ ! -f $${file%.tree}.t.sol ]; then \
echo "[Scaffold] $${file%.tree}.t.sol" ; \
bulloak scaffold -s $(SOLIDITY_VERSION) --vm-skip -w $$file ; \
else \
echo "[Sync file] $${file%.tree}.t.sol" ; \
bulloak check --fix $$file ; \
fi \
done
check-tests: $(TREE_FILES) ## Checks if solidity files are out of sync
bulloak check $^
markdown-tests: $(TEST_TREE_MARKDOWN) ## Generates a markdown file with the test definitions rendered as a tree
# Internal targets
# Generate a markdown file with the test trees
$(TEST_TREE_MARKDOWN): $(TREE_FILES)
@echo "[Markdown] TEST_TREE.md"
@echo "# Test tree definitions" > $@
@echo "" >> $@
@echo "Below is the graphical definition of the contract tests implemented on [the test folder](./test)" >> $@
@echo "" >> $@
@for file in $^; do \
echo "\`\`\`" >> $@ ; \
cat $$file >> $@ ; \
echo "\`\`\`" >> $@ ; \
echo "" >> $@ ; \
done
# Internal dependencies and transformations
$(TREE_FILES): $(SOURCE_FILES)
%.tree: %.t.yaml
@for file in $^; do \
echo "[Convert] $$file -> $${file%.t.yaml}.tree" ; \
cat $$file | $(MAKE_TEST_TREE) > $${file%.t.yaml}.tree ; \
done
# Copy the .env files if not present
.env:
cp .env.example .env
@echo "NOTE: Edit the correct values of .env before you continue"
.env.test:
cp .env.test.example .env.test
@echo "NOTE: Edit the correct values of .env.test before you continue"
# : ##
# #### Fork testing ####
# test-fork-mint-testnet: export MINT_TEST_TOKENS = true
# test-fork-mint-prodnet: export MINT_TEST_TOKENS = true
# test-fork-mint-testnet: test-fork-testnet ## Clean fork test, minting test tokens (testnet)
# test-fork-mint-prodnet: test-fork-prodnet ## Clean fork test, minting test tokens (production network)
# : ##
# test-fork-testnet: export RPC_URL = $(TESTNET_RPC_URL)
# test-fork-prodnet: export RPC_URL = $(PRODNET_RPC_URL)
# test-fork-testnet: export FORK_BLOCK_NUMBER = $(FORK_TESTNET_BLOCK_NUMBER)
# test-fork-prodnet: export FORK_BLOCK_NUMBER = $(FORK_PRODNET_BLOCK_NUMBER)
# test-fork-testnet: test-fork ## Fork test using the existing token(s), new factory (testnet)
# test-fork-prodnet: test-fork ## Fork test using the existing token(s), new factory (production network)
# : ##
# # Override the fork test mode (existing factory)
# test-fork-factory-testnet: export FORK_TEST_MODE = existing-factory
# test-fork-factory-prodnet: export FORK_TEST_MODE = existing-factory
# test-fork-factory-testnet: test-fork-testnet ## Fork test using an existing factory (testnet)
# test-fork-factory-prodnet: test-fork-prodnet ## Fork test using an existing factory (production network)
# .PHONY: test-fork
# test-fork:
# @if [ -z "$(strip $(FORK_BLOCK_NUMBER))" ] ; then \
# forge test --match-contract $(E2E_TEST_NAME) \
# --rpc-url $(RPC_URL) \
# $(VERBOSITY) ; \
# else \
# forge test --match-contract $(E2E_TEST_NAME) \
# --rpc-url $(RPC_URL) \
# --fork-block-number $(FORK_BLOCK_NUMBER) \
# $(VERBOSITY) ; \
# fi
: ##
#### Deployment targets ####
pre-deploy-mint-testnet: export MINT_TEST_TOKENS = true
pre-deploy-testnet: export RPC_URL = $(TESTNET_RPC_URL)
pre-deploy-testnet: export NETWORK = $(TESTNET_NETWORK)
pre-deploy-prodnet: export RPC_URL = $(PRODNET_RPC_URL)
pre-deploy-prodnet: export NETWORK = $(PRODNET_NETWORK)
pre-deploy-mint-testnet: pre-deploy-testnet ## Simulate a deployment to the testnet, minting test token(s)
pre-deploy-testnet: pre-deploy ## Simulate a deployment to the testnet
pre-deploy-prodnet: pre-deploy ## Simulate a deployment to the production network
: ##
deploy-mint-testnet: export MINT_TEST_TOKENS = true
deploy-testnet: export RPC_URL = $(TESTNET_RPC_URL)
deploy-testnet: export NETWORK = $(TESTNET_NETWORK)
deploy-prodnet: export RPC_URL = $(PRODNET_RPC_URL)
deploy-prodnet: export NETWORK = $(PRODNET_NETWORK)
deploy-testnet: export DEPLOYMENT_LOG_FILE=./deployment-$(patsubst "%",%,$(TESTNET_NETWORK))-$(shell date +"%y-%m-%d-%H-%M").log
deploy-prodnet: export DEPLOYMENT_LOG_FILE=./deployment-$(patsubst "%",%,$(PRODNET_NETWORK))-$(shell date +"%y-%m-%d-%H-%M").log
deploy-mint-testnet: deploy-testnet ## Deploy to the testnet, mint a token and verify
deploy-testnet: deploy ## Deploy to the testnet and verify
deploy-prodnet: deploy ## Deploy to the production network and verify
.PHONY: pre-deploy
pre-deploy:
@echo "Simulating the deployment"
forge script $(DEPLOY_SCRIPT) \
--chain $(NETWORK) \
--rpc-url $(RPC_URL) \
$(VERBOSITY)
.PHONY: deploy
deploy: test
@echo "Starting the deployment"
@mkdir -p logs/
forge script $(DEPLOY_SCRIPT) \
--chain $(NETWORK) \
--rpc-url $(RPC_URL) \
--broadcast \
--verify \
$(VERIFIER_TYPE_PARAM) \
$(VERIFIER_URL_PARAM) \
$(ETHERSCAN_API_KEY_PARAM) \
$(VERBOSITY) | tee logs/$(DEPLOYMENT_LOG_FILE)
: ##
refund: export DEPLOYMENT_ADDRESS = $(shell cast wallet address --private-key $(DEPLOYMENT_PRIVATE_KEY))
.PHONY: refund
refund: ## Refund the remaining balance left on the deployment account
@echo "Refunding the remaining balance on $(DEPLOYMENT_ADDRESS)"
@if [ -z $(REFUND_ADDRESS) -o $(REFUND_ADDRESS) = "0x0000000000000000000000000000000000000000" ]; then \
echo "- The refund address is empty" ; \
exit 1; \
fi
@BALANCE=$(shell cast balance $(DEPLOYMENT_ADDRESS) --rpc-url $(PRODNET_RPC_URL)) && \
GAS_PRICE=$(shell cast gas-price --rpc-url $(PRODNET_RPC_URL)) && \
REMAINING=$$(echo "$$BALANCE - $$GAS_PRICE * 21000" | bc) && \
\
ENOUGH_BALANCE=$$(echo "$$REMAINING > 0" | bc) && \
if [ "$$ENOUGH_BALANCE" = "0" ]; then \
echo -e "- No balance can be refunded: $$BALANCE wei\n- Minimum balance: $${REMAINING:1} wei" ; \
exit 1; \
fi ; \
echo -n -e "Summary:\n- Refunding: $$REMAINING (wei)\n- Recipient: $(REFUND_ADDRESS)\n\nContinue? (y/N) " && \
\
read CONFIRM && \
if [ "$$CONFIRM" != "y" ]; then echo "Aborting" ; exit 1; fi ; \
\
cast send --private-key $(DEPLOYMENT_PRIVATE_KEY) \
--rpc-url $(PRODNET_RPC_URL) \
--value $$REMAINING \
$(REFUND_ADDRESS)