Skip to content

Commit e3154ac

Browse files
committed
fix: make deployment work for v1.5
1 parent 1871585 commit e3154ac

4 files changed

Lines changed: 109 additions & 43 deletions

File tree

deployments/protocol/v1.5.json

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
11
{
2-
2+
"11155111": {
3+
"categoryRegistry": "0xbB2168d5546A94AE2DA9254e63D88F7f137B2534",
4+
"chainlinkFeedRegistry": "0x8D5e90706E52a52853dA9A14fA1c63889a412851",
5+
"config": "0xd52a2898d61636bB3eEF0d145f05352FF543bdCC",
6+
"configSingleton": "0x1f5febF0efA3aD487508b6Cc7f39a0a54DE9De72",
7+
"crowdsourceLenderVault": "",
8+
"hooks": {
9+
"compoundLender": "",
10+
"directLenderRepayment": "",
11+
"refinanceBorrowerCreate": ""
12+
},
13+
"hub": "0x37807A2F031b3B44081F4b21500E5D70EbaDAdd5",
14+
"loan": "",
15+
"loanToken": "0x4440C069272cC34b80C7B11bEE657D0349Ba9C23",
16+
"products": {
17+
"installments": ""
18+
},
19+
"revokedNonce": "0x972204fF33348ee6889B2d0A3967dB67d7b08e4c",
20+
"utilizedCredit": "0x8E6F44DEa3c11d69C63655BDEcbA25Fa986BCE9D"
21+
}
322
}

foundry.toml

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,41 @@ gas_reports = ["PWNSimpleLoan"]
1414

1515
[rpc_endpoints]
1616
# Mainnets
17-
mainnet = "${ETHEREUM_URL}"
18-
polygon = "${POLYGON_URL}"
19-
arbitrum = "${ARBITRUM_URL}"
20-
optimism = "${OPTIMISM_URL}"
21-
base = "${BASE_URL}"
22-
cronos = "${CRONOS_URL}"
23-
mantle = "${MANTLE_URL}"
24-
bsc = "${BSC_URL}"
25-
linea = "${LINEA_URL}"
26-
gnosis = "${GNOSIS_URL}"
27-
world = "${WORLDCHAIN_URL}"
28-
unichain = "${UNICHAIN_URL}"
29-
ink = "${INK_URL}"
30-
sonic = "${SONIC_URL}"
31-
celo = "${CELO_URL}"
17+
#mainnet = "${ETHEREUM_URL}"
18+
#polygon = "${POLYGON_URL}"
19+
#arbitrum = "${ARBITRUM_URL}"
20+
#optimism = "${OPTIMISM_URL}"
21+
#base = "${BASE_URL}"
22+
#cronos = "${CRONOS_URL}"
23+
#mantle = "${MANTLE_URL}"
24+
#bsc = "${BSC_URL}"
25+
#linea = "${LINEA_URL}"
26+
#gnosis = "${GNOSIS_URL}"
27+
#world = "${WORLDCHAIN_URL}"
28+
#unichain = "${UNICHAIN_URL}"
29+
#ink = "${INK_URL}"
30+
#sonic = "${SONIC_URL}"
31+
#celo = "${CELO_URL}"
3232
# Testnets
3333
sepolia = "${SEPOLIA_URL}"
34-
unichain-sepolia = "${UNICHAIN_SEPOLIA_URL}"
34+
#unichain-sepolia = "${UNICHAIN_SEPOLIA_URL}"
3535
# Devnets
36-
tenderly = "${TENDERLY_URL}"
37-
local = "${LOCAL_URL}"
36+
#tenderly = "${TENDERLY_URL}"
37+
#local = "${LOCAL_URL}"
3838

3939

4040
[etherscan]
41-
mainnet = { key = "${ETHERSCAN_MAINNET_API_KEY}" }
42-
polygon = { key = "${POLYGONSCAN_API_KEY}" }
43-
arbitrum = { key = "${ARBISCAN_API_KEY}" }
44-
optimism = { key = "${OPTIMISTIC_ETHERSCAN_API_KEY}" }
45-
base = { key = "${BASESCAN_API_KEY}" }
46-
cronos = { key = "${CRONOSCAN_API_KEY}" }
47-
bsc = { key = "${BSCSCAN_API_KEY}" }
48-
linea = { key = "${LINEASCAN_API_KEY}" }
49-
gnosis = { key = "${GNOSISSCAN_API_KEY}" }
50-
world = { key = "${WORLDSCAN_API_KEY}" }
51-
unichain = { key = "${UNISCAN_API_KEY}", url = "https://api.uniscan.xyz/api", chain = 130 }
52-
sonic = { key = "${SONICSCAN_API_KEY}", url = "https://api.sonicscan.org/api", chain = 146 }
41+
#mainnet = { key = "${ETHERSCAN_MAINNET_API_KEY}" }
42+
#polygon = { key = "${POLYGONSCAN_API_KEY}" }
43+
# arbitrum = { key = "${ARBISCAN_API_KEY}" }
44+
# optimism = { key = "${OPTIMISTIC_ETHERSCAN_API_KEY}" }
45+
# base = { key = "${BASESCAN_API_KEY}" }
46+
#cronos = { key = "${CRONOSCAN_API_KEY}" }
47+
#bsc = { key = "${BSCSCAN_API_KEY}" }
48+
#linea = { key = "${LINEASCAN_API_KEY}" }
49+
#gnosis = { key = "${GNOSISSCAN_API_KEY}" }
50+
#world = { key = "${WORLDSCAN_API_KEY}" }
51+
#unichain = { key = "${UNISCAN_API_KEY}", url = "https://api.uniscan.xyz/api", chain = 130 }
52+
#sonic = { key = "${SONICSCAN_API_KEY}", url = "https://api.sonicscan.org/api", chain = 146 }
5353

5454
sepolia = { key = "${ETHERSCAN_MAINNET_API_KEY}" }

script/PWN.s.sol

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ import {
2121
MultiTokenCategoryRegistry,
2222
IChainlinkFeedRegistryLike,
2323
PWNStableProduct,
24-
PWNWorldStableProduct
24+
PWNInstallmentsProduct
2525
} from "pwn/Deployments.sol";
2626

27+
import { PWNCrowdsourceLenderVault } from "pwn/periphery/crowdsource/PWNCrowdsourceLenderVault.sol";
28+
2729

2830
library PWNContractDeployerSalt {
2931

@@ -44,7 +46,10 @@ library PWNContractDeployerSalt {
4446
bytes32 internal constant FIXED_PRODUCT = keccak256("PWNFixedProduct");
4547
bytes32 internal constant UNISWAP_V3_INDIVIDUAL_PRODUCT = keccak256("PWNUniswapV3IndividualProduct");
4648
bytes32 internal constant UNISWAP_V3_SET_PRODUCT = keccak256("PWNUniswapV3SetProduct");
49+
bytes32 internal constant INSTALLMENTS_PRODUCT = keccak256("PWNInstallmentsProduct");
4750

51+
// Others
52+
bytes32 internal constant CROWDSOURCE_LENDER_VAULT = keccak256("PWNCrowdsourceLenderVault");
4853
}
4954

5055
using GnosisSafeUtils for GnosisSafeLike;
@@ -100,36 +105,75 @@ forge script script/PWN.s.sol:Deploy --sig "deploy()" \
100105
PWNContractDeployerSalt.LOAN,
101106
abi.encodePacked(
102107
type(PWNLoan).creationCode,
103-
abi.encode(address(__d.hub), address(__d.loanToken), address(__d.config), address(__d.categoryRegistry), __e.permit2)
108+
abi.encode(address(__d.loanToken), address(__d.config), address(__d.categoryRegistry))
104109
)
105110
)
106111
);
107112

108-
__d.products.stable = PWNStableProduct(
113+
__d.products.installments = PWNInstallmentsProduct(
109114
_deploy(
110-
PWNContractDeployerSalt.STABLE_PRODUCT,
115+
PWNContractDeployerSalt.INSTALLMENTS_PRODUCT,
111116
abi.encodePacked(
112-
type(PWNWorldStableProduct).creationCode,
113-
abi.encode(address(__d.hub), address(__d.revokedNonce), address(__d.utilizedCredit), address(__d.chainlinkFeedRegistry), __e.chainlinkL2SequencerUptimeFeed, __e.weth, 0x17B354dD2595411ff79041f930e491A4Df39A278, "app_17abe44eaf47c99566f5378aa4e19463", "verify-humanness")
117+
type(PWNInstallmentsProduct).creationCode,
118+
abi.encode(address(__d.hub), address(__d.revokedNonce), address(__d.utilizedCredit), address(__d.chainlinkFeedRegistry), __e.chainlinkL2SequencerUptimeFeed, __e.weth)
114119
)
115120
)
116121
);
117122

118123
console2.log("PWNLoan:", address(__d.loan));
119-
console2.log("PWNStableProduct:", address(__d.products.stable));
124+
console2.log("PWNInstallmentsProduct:", address(__d.products.installments));
120125

121-
address[] memory addrs = new address[](3);
126+
address[] memory addrs = new address[](2);
122127
addrs[0] = address(__d.loan);
123-
addrs[1] = address(__d.products.stable);
124-
addrs[2] = address(__d.products.stable);
128+
addrs[1] = address(__d.products.installments);
125129

126-
bytes32[] memory tags = new bytes32[](3);
130+
bytes32[] memory tags = new bytes32[](2);
127131
tags[0] = PWNHubTags.ACTIVE_LOAN;
128132
tags[1] = PWNHubTags.LOAN_PROPOSAL;
129-
tags[2] = PWNHubTags.NONCE_MANAGER;
130133

134+
// TODO on what contract this should be called?
131135
console2.logBytes(abi.encodeWithSignature("setTags(address[],bytes32[],bool)", addrs, tags, true));
132136

137+
address[] memory feedIntermediaryDenominations = new address[](1);
138+
// USDC / USD feed + ETH / USD feed
139+
feedIntermediaryDenominations[0] = address(840); // USD representation in chainlink
140+
bool[] memory feedInvertFlags = new bool[](2);
141+
feedInvertFlags[0] = false;
142+
feedInvertFlags[1] = true;
143+
144+
__d.crowdsourceLenderVault = PWNCrowdsourceLenderVault(
145+
_deploy(
146+
PWNContractDeployerSalt.CROWDSOURCE_LENDER_VAULT,
147+
abi.encodePacked(
148+
type(PWNCrowdsourceLenderVault).creationCode,
149+
// TODO Terms terms parameter
150+
abi.encode(
151+
address(__d.loan),
152+
address(__d.products.installments),
153+
address(__e.aave),
154+
"PWNInstallmentsProduct",
155+
"PWNInstallmentsProduct",
156+
PWNCrowdsourceLenderVault.Terms({
157+
collateralAddress: address(0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9),
158+
creditAddress: address(0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8),
159+
feedIntermediaryDenominations: feedIntermediaryDenominations,
160+
feedInvertFlags: feedInvertFlags,
161+
loanToValue: 7500, // 75%
162+
interestAPR: 1000, // 10%
163+
postponement: 2592000, // 30 days in seconds
164+
duration: 63072000, // 730 days (2 years) in seconds
165+
minCreditAmount: 5000000000, // 5000 tokens (assuming 6 decimals)
166+
expiration: block.timestamp + 10368000 // 120 days from now
167+
})
168+
)
169+
)
170+
)
171+
);
172+
173+
console2.log("PWNCrowdsourceLenderVault:", address(__d.crowdsourceLenderVault));
174+
175+
// TODO anything else to do here?
176+
133177
vm.stopBroadcast();
134178
}
135179

src/Deployments.sol

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import { PWNDirectLenderRepaymentHook } from "pwn/periphery/hook/lender/PWNDirec
3131
import { PWNRevokedNonce } from "pwn/periphery/auxiliary/PWNRevokedNonce.sol";
3232
import { PWNUtilizedCredit } from "pwn/periphery/auxiliary/PWNUtilizedCredit.sol";
3333

34+
import { PWNCrowdsourceLenderVault } from "pwn/periphery/crowdsource/PWNCrowdsourceLenderVault.sol";
35+
3436

3537
interface IPWNDeployer {
3638
function owner() external returns (address);
@@ -72,6 +74,7 @@ abstract contract Deployments is CommonBase {
7274
IChainlinkFeedRegistryLike chainlinkFeedRegistry;
7375
PWNConfig config;
7476
PWNConfig configSingleton;
77+
PWNCrowdsourceLenderVault crowdsourceLenderVault;
7578
Hooks hooks;
7679
PWNHub hub;
7780
PWNLoan loan;

0 commit comments

Comments
 (0)