Skip to content

Commit 3934c25

Browse files
committed
Add Chainlog and DssVest deployments
1 parent 73a53b3 commit 3934c25

File tree

11 files changed

+193
-68
lines changed

11 files changed

+193
-68
lines changed

.dapp.json

+26
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,18 @@
220220
"url": "https://github.com/makerdao/dss-cdp-manager"
221221
}
222222
},
223+
"dss-chain-log_1a1131d": {
224+
"deps": {
225+
"ds-test": "ds-test_0a5da56"
226+
},
227+
"name": "dss-chain-log",
228+
"repo": {
229+
"name": "dss-chain-log-1a1131d",
230+
"ref": "HEAD",
231+
"rev": "1a1131d5a6334d2b6a5dbfb3495514462ed528a8",
232+
"url": "https://github.com/makerdao/dss-chain-log"
233+
}
234+
},
223235
"dss-deploy-pause-proxy-actions_3781fa8": {
224236
"deps": {
225237
"ds-proxy": "ds-proxy_e17a252",
@@ -308,6 +320,18 @@
308320
"url": "https://github.com/makerdao/dss-proxy-actions"
309321
}
310322
},
323+
"dss-vest_cbe7426": {
324+
"deps": {
325+
"ds-test": "ds-test_0a5da56"
326+
},
327+
"name": "dss-vest",
328+
"repo": {
329+
"name": "dss-vest-cbe7426",
330+
"ref": "HEAD",
331+
"rev": "cbe7426e6bb8c2ae81dd78da5f4be19c53071082",
332+
"url": "https://github.com/makerdao/dss-vest"
333+
}
334+
},
311335
"dss_8144130": {
312336
"deps": {
313337
"ds-test": "ds-test_0a5da56",
@@ -550,12 +574,14 @@
550574
"dsr-manager": "dsr-manager_6d79bcb",
551575
"dss-auto-line": "dss-auto-line_26ad11b",
552576
"dss-cdp-manager": "dss-cdp-manager_342a1e6",
577+
"dss-chain-log": "dss-chain-log_1a1131d",
553578
"dss-deploy": "dss-deploy_898b76b",
554579
"dss-deploy-1_2": "dss-deploy_18e9d69",
555580
"dss-deploy-pause-proxy-actions": "dss-deploy-pause-proxy-actions_3781fa8",
556581
"dss-flash": "dss-flash_e19d38a",
557582
"dss-gem-joins": "dss-gem-joins_266b43a",
558583
"dss-proxy-actions": "dss-proxy-actions_228f2d5",
584+
"dss-vest": "dss-vest_cbe7426",
559585
"flipper-mom": "flipper-mom_1e879f6",
560586
"ilk-registry": "ilk-registry_34a354f",
561587
"mkr-authority": "mkr-authority_990745c",

bin/auth-checker

+12-1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ checkRely "MCD_VAT" "MCD_END" "AUTHED"
140140
checkRely "MCD_VAT" "MCD_ESM" "AUTHED"
141141
checkRely "MCD_VAT" "MCD_IAM_AUTO_LINE" "AUTHED"
142142
checkRely "MCD_VAT" "MCD_FLASH" "AUTHED"
143+
checkRely "MCD_VAT" "MCD_VEST_DAI" "AUTHED"
143144
checkRely "MCD_VAT" "MCD_PAUSE_PROXY" "AUTHED"
144145
for token in $tokens; do
145146
ilks=$(jq -r ".tokens.${token}.ilks | keys_unsorted[]" "$CONFIG_FILE")
@@ -239,14 +240,14 @@ checkAuthority "MCD_ADM" "MCD_ADM"
239240
checkOwner "MCD_GOV" "MCD_PAUSE_PROXY"
240241
canCall "MCD_FLOP" "MCD_GOV" "mint(address,uint256)"
241242
canCall "MCD_FLAP" "MCD_GOV" "burn(address,uint256)"
243+
canCall "MCD_VEST_MKR" "MCD_GOV" "mint(address,uint256)"
242244

243245
# gov guard
244246
if [[ -n "$GOV_GUARD" ]]; then
245247
checkRoot "GOV_GUARD" "MCD_PAUSE_PROXY"
246248
checkAuthority "MCD_GOV" "GOV_GUARD"
247249
fi
248250

249-
250251
# iou
251252
if [[ -n "$MCD_IOU" ]]; then
252253
checkOwner "MCD_IOU" "MCD_ADM"
@@ -355,3 +356,13 @@ checkRely "ILK_REGISTRY" "MCD_PAUSE_PROXY" "AUTHED"
355356
# dssFlash
356357
checkRely "MCD_FLASH" "DEPLOYER" "NOT_AUTHED"
357358
checkRely "MCD_FLASH" "MCD_PAUSE_PROXY" "AUTHED"
359+
360+
# chainlog
361+
checkRely "CHANGELOG" "DEPLOYER" "NOT_AUTHED"
362+
checkRely "CHANGELOG" "MCD_PAUSE_PROXY" "AUTHED"
363+
364+
# dssVest
365+
checkRely "MCD_VEST_DAI" "DEPLOYER" "NOT_AUTHED"
366+
checkRely "MCD_VEST_DAI" "MCD_PAUSE_PROXY" "AUTHED"
367+
checkRely "MCD_VEST_MKR" "DEPLOYER" "NOT_AUTHED"
368+
checkRely "MCD_VEST_MKR" "MCD_PAUSE_PROXY" "AUTHED"

config/kovan.json

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"flash_max": "500000000",
2424
"flash_toll": "0.05",
2525
"import": {
26+
"chainlog": "0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F",
2627
"gov": "0xAaF64BFCC32d0F15873a02163e7E500671a4ffcD",
2728
"authority": "0x27E0c9567729Ea6e3241DE74B3dE499b7ddd3fe6",
2829
"proxyRegistry": "0x64A436ae831C1672AE81F674CAb8B6775df3475C",

config/main.json

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"flash_max": "500000000",
2424
"flash_toll": "0.05",
2525
"import": {
26+
"chainlog": "0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F",
2627
"gov": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2",
2728
"authority": "0x0a3f6849f78076aefaDf113F5BED87720274dDC0",
2829
"proxyRegistry": "0x4678f0a6958e4D2Bc4F1BAF7Bc52E8F3564f3fE4",

default.nix

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ let
5151
dss-deploy-optimized-runs-1 = deps'.dss-deploy // { name = "dss-deploy-optimized-runs-1"; solcFlags = "--optimize --optimize-runs 1"; solc = solc-static-versions.solc_0_6_12; };
5252
symbolic-voting = deps'.symbolic-voting // { name = "symbolic-voting"; solc = solc-static-versions.solc_0_6_6; };
5353
vote-delegate = deps'.vote-delegate // { name = "vote-delegate-optimized"; solcFlags = "--optimize --optimize-runs 200"; solc = solc-static-versions.solc_0_6_12; };
54+
dss-vest = deps'.dss-vest // { name = "dss-vest-optimized"; solcFlags = "--optimize --optimize-runs 200"; solc = solc-static-versions.solc_0_6_12; };
55+
dss-chain-log = deps'.dss-chain-log // { name = "dss-chain-log-optimized"; solcFlags = "--optimize --optimize-runs 200"; solc = solc-static-versions.solc_0_6_12; };
5456
});
5557

5658
in makerScriptPackage {

lib/common.sh

+6
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ log() {
133133
echo ""
134134
}
135135

136+
logAddr() {
137+
sethSend "$CHANGELOG" 'setAddress(bytes32,address)' "$(seth --to-bytes32 "$(seth --from-ascii "$1")")" "$2"
138+
printf '%b\n' "${GREEN}${1}=${2}${NC}"
139+
echo ""
140+
}
141+
136142
toUpper() {
137143
echo "$1" | tr '[:lower:]' '[:upper:]'
138144
}

libexec/base-deploy

+69-26
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@
1818
# shellcheck source=lib/common.sh
1919
. "$LIB_DIR/common.sh"
2020

21+
# Deploy Multicall
22+
newChangelog=false
23+
CHANGELOG=$(jq -r ".import.chainlog | values" "$CONFIG_FILE")
24+
if [[ -z "$CHANGELOG" ]]; then
25+
CHANGELOG=$(dappCreate dss-chain-log-optimized ChainLog)
26+
log "CHANGELOG=$CHANGELOG"
27+
newChangelog=true
28+
else
29+
copy dss-chain-log-optimized
30+
fi
31+
export CHANGELOG
32+
2133
# Deploy Values or Medians
2234
tokens=$(jq -r ".tokens | keys_unsorted[]" "$CONFIG_FILE")
2335
for token in $tokens; do
@@ -28,7 +40,7 @@ for token in $tokens; do
2840
if [[ "$type" == "median" ]]; then
2941
contract=$(dappCreate testchain-medians "Median${token}USD")
3042
eval "export VAL_${token}=${contract}"
31-
log "VAL_${token}=$(eval "echo ${contract}")"
43+
logAddr "VAL_${token}" "$(eval "echo ${contract}")"
3244
signers=$(jq -r ".tokens.${token} | .pipDeploy | .signers | .[]" "$CONFIG_FILE")
3345
# Approve oracle price feed providers
3446
allsigners=()
@@ -43,25 +55,26 @@ for token in $tokens; do
4355
if [[ "${type}" == "value" ]]; then
4456
contract=$(dappCreate ds-value DSValue)
4557
eval "export VAL_${token}=${contract}"
46-
log "VAL_${token}=$(eval "echo ${contract}")"
58+
logAddr "VAL_${token}" "$(eval "echo ${contract}")"
4759
fi
4860
else
4961
eval "export VAL_${token}=${pipAddr}"
5062
copy osm
5163
copy testchain-medians
64+
logAddr "VAL_${token}" "$pipAddr"
5265
fi
5366
eval "export PIP_${token}=\$VAL_${token}"
5467
done
5568

5669
# Deploy Multicall
5770
MULTICALL=$(dappCreate multicall Multicall)
58-
log "MULTICALL=$MULTICALL"
71+
logAddr "MULTICALL" "$MULTICALL"
5972

6073
# Deploy Token Faucet
6174
FAUCET=$(jq -r ".import.faucet | values" "$CONFIG_FILE")
6275
if [[ -z "$FAUCET" ]]; then
6376
FAUCET=$(dappCreate token-faucet RestrictedTokenFaucet)
64-
log "FAUCET=$FAUCET"
77+
logAddr "FAUCET" "$FAUCET"
6578
# Allow everyone to use the faucet
6679
sethSend "$FAUCET" 'hope(address)' "0x0000000000000000000000000000000000000000"
6780
fi
@@ -70,12 +83,16 @@ fi
7083
PROXY_REGISTRY=$(jq -r ".import.proxyRegistry | values" "$CONFIG_FILE")
7184
if [[ -z "$PROXY_REGISTRY" ]]; then
7285
PROXY_FACTORY=$(dappCreate ds-proxy DSProxyFactory)
73-
log "PROXY_FACTORY=$PROXY_FACTORY"
86+
logAddr "PROXY_FACTORY" "$PROXY_FACTORY"
7487
PROXY_REGISTRY=$(dappCreate proxy-registry ProxyRegistry "$PROXY_FACTORY")
75-
log "PROXY_REGISTRY=$PROXY_REGISTRY"
88+
logAddr "PROXY_REGISTRY" "$PROXY_REGISTRY"
7689
else
7790
PROXY_FACTORY=$(seth storage "$PROXY_REGISTRY" 1)
7891
PROXY_FACTORY=0x${PROXY_FACTORY:26:66}
92+
logAddr "PROXY_FACTORY" "$PROXY_FACTORY"
93+
logAddr "PROXY_REGISTRY" "$PROXY_REGISTRY"
94+
copy ds-proxy
95+
copy proxy-registry
7996
fi
8097

8198
# Deploy Fabs
@@ -115,7 +132,7 @@ if [[ "$newGovToken" == true ]]; then
115132

116133
# Use custom authority for the new GOV token
117134
GOV_GUARD=$(dappCreate mkr-authority MkrAuthority)
118-
log "GOV_GUARD=$GOV_GUARD"
135+
logAddr "GOV_GUARD" "$GOV_GUARD"
119136

120137
# Set GOV_GUARD as authority of MCD_GOV
121138
sethSend "$MCD_GOV" 'setAuthority(address)' "$GOV_GUARD"
@@ -138,37 +155,37 @@ rm "$OUT_DIR/load-ilks-addr-temp"
138155

139156
# Deploy Proxy Actions
140157
PROXY_ACTIONS=$(dappCreate dss-proxy-actions-optimized DssProxyActions)
141-
log "PROXY_ACTIONS=$PROXY_ACTIONS"
158+
logAddr "PROXY_ACTIONS" "$PROXY_ACTIONS"
142159
PROXY_ACTIONS_END=$(dappCreate dss-proxy-actions-optimized DssProxyActionsEnd)
143-
log "PROXY_ACTIONS_END=$PROXY_ACTIONS_END"
160+
logAddr "PROXY_ACTIONS_END" "$PROXY_ACTIONS_END"
144161
PROXY_ACTIONS_DSR=$(dappCreate dss-proxy-actions-optimized DssProxyActionsDsr)
145-
log "PROXY_ACTIONS_DSR=$PROXY_ACTIONS_DSR"
162+
logAddr "PROXY_ACTIONS_DSR" "$PROXY_ACTIONS_DSR"
146163

147164
# Deploy CdpManager
148165
CDP_MANAGER=$(dappCreate dss-cdp-manager DssCdpManager "$MCD_VAT")
149-
log "CDP_MANAGER=$CDP_MANAGER"
166+
logAddr "CDP_MANAGER" "$CDP_MANAGER"
150167
GET_CDPS=$(dappCreate dss-cdp-manager GetCdps)
151-
log "GET_CDPS=$GET_CDPS"
168+
logAddr "GET_CDPS" "$GET_CDPS"
152169

153170
# Deploy DsrManager
154171
DSR_MANAGER=$(dappCreate dsr-manager DsrManager "$MCD_POT" "$MCD_JOIN_DAI")
155-
log "DSR_MANAGER=$DSR_MANAGER"
172+
logAddr "DSR_MANAGER" "$DSR_MANAGER"
156173

157174
# Deploy OsmMom
158175
OSM_MOM=$(dappCreate osm-mom OsmMom)
159-
log "OSM_MOM=$OSM_MOM"
176+
logAddr "OSM_MOM" "$OSM_MOM"
160177

161178
# Deploy FlipperMom
162179
FLIPPER_MOM=$(dappCreate flipper-mom FlipperMom "$MCD_CAT")
163-
log "FLIPPER_MOM=$FLIPPER_MOM"
180+
logAddr "FLIPPER_MOM" "$FLIPPER_MOM"
164181

165182
# Deploy ClipperMom
166183
CLIPPER_MOM=$(dappCreate clipper-mom-optimized ClipperMom "$MCD_SPOT")
167-
log "CLIPPER_MOM=$CLIPPER_MOM"
184+
logAddr "CLIPPER_MOM" "$CLIPPER_MOM"
168185

169186
# Deploy IlkRegistry
170187
ILK_REGISTRY=$(dappCreate ilk-registry-optimized IlkRegistry "$MCD_VAT" "$MCD_DOG" "$MCD_CAT" "$MCD_SPOT")
171-
log "ILK_REGISTRY=$ILK_REGISTRY"
188+
logAddr "ILK_REGISTRY" "$ILK_REGISTRY"
172189

173190
# As all initial collaterals were deployed, we can remove authority of the deployment contract from the core contracts
174191
sethSend "$MCD_DEPLOY" 'releaseAuth()'
@@ -191,11 +208,11 @@ done
191208

192209
# Deploy GovActions - Library functions for the Pause
193210
MCD_GOV_ACTIONS=$(dappCreate dss-deploy-1_2 GovActions)
194-
log "MCD_GOV_ACTIONS=$MCD_GOV_ACTIONS"
211+
logAddr "MCD_GOV_ACTIONS" "$MCD_GOV_ACTIONS"
195212

196213
# Deploy Pause Proxy Actions (support contract for executing initial set up of the dss system)
197214
PROXY_PAUSE_ACTIONS=$(dappCreate dss-deploy-pause-proxy-actions DssDeployPauseProxyActions)
198-
log "PROXY_PAUSE_ACTIONS=$PROXY_PAUSE_ACTIONS"
215+
logAddr "PROXY_PAUSE_ACTIONS" "$PROXY_PAUSE_ACTIONS"
199216

200217
# Get a proxy for the deployer address (create if didn't previously exist)
201218
PROXY_DEPLOYER=$(seth call "$PROXY_REGISTRY" 'proxies(address)(address)' "$ETH_FROM")
@@ -212,24 +229,26 @@ sethSend "$MCD_ADM" 'setRootUser(address,bool)' "$PROXY_DEPLOYER" true
212229
MCD_ADM=$(jq -r ".import.authority | values" "$CONFIG_FILE")
213230
if [[ -z "$MCD_ADM" ]]; then
214231
MCD_IOU=$(dappCreate ds-token DSToken '"IOU"')
215-
log "MCD_IOU=$MCD_IOU"
232+
logAddr "MCD_IOU" "$MCD_IOU"
216233

217234
MCD_ADM=$(dappCreate ds-chief DSChief "$MCD_GOV" "$MCD_IOU" 5)
218-
log "MCD_ADM=$MCD_ADM"
235+
logAddr "MCD_ADM" "$MCD_ADM"
219236
sethSend "$MCD_IOU" 'setOwner(address)' "${MCD_ADM}"
220237

221238
# Deploy Vote Proxy Factory
222239
VOTE_PROXY_FACTORY=$(dappCreate vote-proxy VoteProxyFactory "$MCD_ADM")
223-
log "VOTE_PROXY_FACTORY=$VOTE_PROXY_FACTORY"
240+
logAddr "VOTE_PROXY_FACTORY" "$VOTE_PROXY_FACTORY"
224241

225242
# Deploy PollingEmitter
226243
MCD_POLLING_EMITTER=$(dappCreate symbolic-voting PollingEmitter)
227-
log "MCD_POLLING_EMITTER=$MCD_POLLING_EMITTER"
244+
logAddr "MCD_POLLING_EMITTER" "$MCD_POLLING_EMITTER"
228245

229246
# Deploy Vote Delegate Factory
230247
VOTE_DELEGATE_PROXY_FACTORY=$(dappCreate vote-delegate-optimized VoteDelegateFactory "$MCD_ADM" "$MCD_POLLING_EMITTER")
231-
log "VOTE_DELEGATE_PROXY_FACTORY=$VOTE_DELEGATE_PROXY_FACTORY"
248+
logAddr "VOTE_DELEGATE_PROXY_FACTORY" "$VOTE_DELEGATE_PROXY_FACTORY"
232249
else
250+
logAddr "MCD_IOU" "$(seth call "$MCD_ADM" "IOU()(address)")"
251+
logAddr "MCD_ADM" "$MCD_ADM"
233252
copy ds-chief
234253
copy vote-proxy
235254
copy symbolic-voting
@@ -283,14 +302,14 @@ fi
283302

284303
# Deploy DssAutoLine
285304
MCD_IAM_AUTO_LINE=$(dappCreate dss-auto-line-optimized DssAutoLine "$MCD_VAT")
286-
log "MCD_IAM_AUTO_LINE=$MCD_IAM_AUTO_LINE"
305+
logAddr "MCD_IAM_AUTO_LINE" "$MCD_IAM_AUTO_LINE"
287306
# Rely DssAutoLine in the Vat
288307
calldata="$(seth calldata 'rely(address,address,address,address)' "$MCD_PAUSE" "$MCD_GOV_ACTIONS" "$MCD_VAT" "$MCD_IAM_AUTO_LINE")"
289308
sethSend "$PROXY_DEPLOYER" 'execute(address,bytes memory)' "$PROXY_PAUSE_ACTIONS" "$calldata"
290309

291310
# Deploy DssFlash
292311
MCD_FLASH=$(dappCreate dss-flash DssFlash "$MCD_JOIN_DAI" "$MCD_VOW")
293-
log "MCD_FLASH=$MCD_FLASH"
312+
logAddr "MCD_FLASH" "$MCD_FLASH"
294313
# Rely DssFlash in the Vat
295314
set -e
296315
calldata="$(seth calldata 'rely(address,address,address,address)' "$MCD_PAUSE" "$MCD_GOV_ACTIONS" "$MCD_VAT" "$MCD_FLASH")"
@@ -299,11 +318,28 @@ sethSend "$PROXY_DEPLOYER" 'execute(address,bytes memory)' "$PROXY_PAUSE_ACTIONS
299318
sethSend "$MCD_FLASH" 'rely(address)' "$MCD_PAUSE_PROXY"
300319
sethSend "$MCD_FLASH" 'deny(address)' "$ETH_FROM"
301320

321+
# Deploy both DssVest
322+
MCD_VEST_DAI=$(dappCreate dss-vest-optimized DssVestSuckable "$CHANGELOG")
323+
logAddr "MCD_VEST_DAI" "$MCD_VEST_DAI"
324+
sethSend "$MCD_VEST_DAI" 'rely(address)' "$MCD_PAUSE_PROXY"
325+
sethSend "$MCD_VEST_DAI" 'deny(address)' "$ETH_FROM"
326+
calldata="$(seth calldata 'rely(address,address,address,address)' "$MCD_PAUSE" "$MCD_GOV_ACTIONS" "$MCD_VAT" "$MCD_VEST_DAI")"
327+
sethSend "$PROXY_DEPLOYER" 'execute(address,bytes memory)' "$PROXY_PAUSE_ACTIONS" "$calldata"
328+
MCD_VEST_MKR=$(dappCreate dss-vest-optimized DssVestMintable "$MCD_GOV")
329+
logAddr "MCD_VEST_MKR" "$MCD_VEST_MKR"
330+
sethSend "$MCD_VEST_MKR" 'rely(address)' "$MCD_PAUSE_PROXY"
331+
sethSend "$MCD_VEST_MKR" 'deny(address)' "$ETH_FROM"
332+
if [[ "$newGovToken" == true ]]; then
333+
calldata="$(seth calldata 'rely(address,address,address,address)' "$MCD_PAUSE" "$MCD_GOV_ACTIONS" "$GOV_GUARD" "$MCD_VEST_MKR")"
334+
sethSend "$PROXY_DEPLOYER" 'execute(address,bytes memory)' "$PROXY_PAUSE_ACTIONS" "$calldata"
335+
fi
336+
302337
# Generate addresses.json file
303338
# shellcheck disable=SC2153
304339
cat > "$OUT_DIR"/addresses.json <<EOF
305340
{
306341
"DEPLOYER": "$(seth --to-checksum-address "$ETH_FROM")",
342+
"CHANGELOG": "$CHANGELOG",
307343
"MULTICALL": "$MULTICALL",
308344
"FAUCET": "$(seth --to-checksum-address "$FAUCET")",
309345
"MCD_DEPLOY": "$MCD_DEPLOY",
@@ -340,6 +376,8 @@ cat > "$OUT_DIR"/addresses.json <<EOF
340376
"CLIPPER_MOM": "$CLIPPER_MOM",
341377
"MCD_IAM_AUTO_LINE": "$MCD_IAM_AUTO_LINE",
342378
"MCD_FLASH": "$MCD_FLASH",
379+
"MCD_VEST_DAI": "$MCD_VEST_DAI",
380+
"MCD_VEST_MKR": "$MCD_VEST_MKR",
343381
"PROXY_FACTORY": "$(seth --to-checksum-address "$PROXY_FACTORY")",
344382
"PROXY_REGISTRY": "$(seth --to-checksum-address "$PROXY_REGISTRY")"$ILKS_VARS,
345383
"PROXY_PAUSE_ACTIONS": "$PROXY_PAUSE_ACTIONS",
@@ -445,3 +483,8 @@ fi
445483
"$LIBEXEC_DIR"/setters/set-ilks-registry
446484

447485
"$LIBEXEC_DIR"/setters/set-pause-auth-delay
486+
487+
if [[ "$newChangelog" == true ]]; then
488+
sethSend "$CHANGELOG" 'rely(address)' "$MCD_PAUSE_PROXY"
489+
sethSend "$CHANGELOG" 'deny(address)' "$ETH_FROM"
490+
fi

0 commit comments

Comments
 (0)