Skip to content

Commit efc0ad9

Browse files
authored
feat: Horizon RWA Deployment Scripts
Horizon RWA deployment
2 parents e0762f5 + 925e1b3 commit efc0ad9

32 files changed

+2224
-172
lines changed

.env.example

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,24 @@
1-
# Broadcast user address
2-
SENDER=
1+
# Required for all deployments
2+
CHAIN=
3+
ACCOUNT= # Account name from encrypted keystore, see https://getfoundry.sh/cast/reference/cast-wallet-import/
34

4-
# Deployment via ledger
5-
MNEMONIC_INDEX=
6-
LEDGER_SENDER=
7-
8-
# Deployment via private key
9-
PRIVATE_KEY=
10-
11-
# Test rpc_endpoints
5+
# Required for all operations
6+
# Should be replaced with dedicated RPC endpoints
127
RPC_MAINNET=https://eth.llamarpc.com
13-
RPC_AVALANCHE=https://api.avax.network/ext/bc/C/rpc
148
RPC_OPTIMISM=https://optimism.llamarpc.com
9+
RPC_AVALANCHE=https://api.avax.network/ext/bc/C/rpc
1510
RPC_POLYGON=https://polygon.llamarpc.com
1611
RPC_ARBITRUM=https://arbitrum.llamarpc.com
1712
RPC_FANTOM=https://rpc.ftm.tools
18-
RPC_HARMONY=https://api.harmony.one
19-
RPC_METIS=https://andromeda.metis.io/?owner=1088
20-
RPC_BASE=https://base.llamarpc.com
21-
RPC_ZKEVM=https://zkevm-rpc.com
22-
RPC_GNOSIS=https://rpc.ankr.com/gnosis
23-
RPC_BNB=https://binance.llamarpc.com
2413
RPC_SCROLL=https://rpc.scroll.io
25-
RPC_AMOY="https://rpc-amoy.polygon.technology"
26-
27-
# Etherscan api keys for verification & download utils
28-
ETHERSCAN_API_KEY_MAINNET=
29-
ETHERSCAN_API_KEY_POLYGON=
30-
ETHERSCAN_API_KEY_AVALANCHE=
31-
ETHERSCAN_API_KEY_FANTOM=
32-
ETHERSCAN_API_KEY_OPTIMISM=
33-
ETHERSCAN_API_KEY_ARBITRUM=
34-
ETHERSCAN_API_KEY_BASE=
35-
ETHERSCAN_API_KEY_ZKEVM=
36-
ETHERSCAN_API_KEY_GNOSIS=
37-
ETHERSCAN_API_KEY_BNB=
38-
ETHERSCAN_API_KEY_SCROLL=
39-
ETHERSCAN_API_KEY_CELO=
14+
RPC_CELO=https://rpc.ankr.com/celo
15+
RPC_BNB=https://binance.llamarpc.com
16+
RPC_GNOSIS=https://rpc.ankr.com/gnosis
17+
RPC_BASE=https://base.llamarpc.com
18+
RPC_METIS=https://andromeda.metis.io/?owner=1088
19+
RPC_LINEA=https://linea.drpc.org
20+
RPC_SEPOLIA=https://ethereum-sepolia-rpc.publicnode.com
4021

41-
# Simulation/fork creation
42-
TENDERLY_ACCESS_TOKEN=
43-
TENDERLY_ACCOUNT=
44-
TENDERLY_PROJECT=
22+
# Required for all operations. Uses etherscan v2.
23+
ETHERSCAN_API_KEY=
24+
VERIFIER_URL=https://api.etherscan.io/api

.github/workflows/certora-basic.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ jobs:
5858
certora/basic/conf/NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowOnReserveDisabledForBorrowing
5959
certora/basic/conf/NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowOnFrozenReserve
6060
solc-versions: 0.8.19
61-
comment-fail-only: false
61+
comment-fail-only: true
6262
solc-remove-version-prefix: "0."
6363
job-name: "Certora Prover Run"
6464
certora-key: ${{ secrets.CERTORAKEY }}

.github/workflows/certora-stata.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ jobs:
6464
certora/stata/conf/verifyDoubleClaim.conf --rule prevent_duplicate_reward_claiming_single_reward_sufficient
6565
certora/stata/conf/verifyDoubleClaim.conf --rule prevent_duplicate_reward_claiming_single_reward_insufficient
6666
solc-versions: 0.8.20
67-
comment-fail-only: false
67+
comment-fail-only: true
6868
solc-remove-version-prefix: "0."
6969
job-name: "Certora Prover Run"
7070
certora-key: ${{ secrets.CERTORAKEY }}

.github/workflows/comment.yml

Lines changed: 0 additions & 23 deletions
This file was deleted.

Makefile

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,38 @@ git-diff :
4343

4444
# Deploy
4545
deploy-libs-one :;
46-
FOUNDRY_PROFILE=${chain} forge script scripts/misc/LibraryPreCompileOne.sol --rpc-url ${chain} --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --slow --broadcast
46+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/misc/LibraryPreCompileOne.sol \
47+
--rpc-url ${CHAIN} --account ${ACCOUNT} --slow --broadcast --gas-estimate-multiplier 150 \
48+
--verify --chain ${CHAIN}
4749
deploy-libs-two :;
48-
FOUNDRY_PROFILE=${chain} forge script scripts/misc/LibraryPreCompileTwo.sol --rpc-url ${chain} --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --slow --broadcast
49-
50+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/misc/LibraryPreCompileTwo.sol \
51+
--rpc-url ${CHAIN} --account ${ACCOUNT} --slow --broadcast --gas-estimate-multiplier 150 \
52+
--verify --chain ${CHAIN}
53+
54+
# STEP 1: Deploy scaled price adapters. `make deploy-scaled-price-adapter source=<PRICE_FEED_ADDRESS>`
55+
deploy-scaled-price-adapter :;
56+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/misc/DeployScaledPriceAdapter.sol:DeployScaledPriceAdapter \
57+
--rpc-url ${CHAIN} --account ${ACCOUNT} --slow --broadcast --gas-estimate-multiplier 150 \
58+
--verify --chain ${CHAIN} --verifier-url ${VERIFIER_URL} \
59+
--sig "run(address)" ${source}
60+
61+
# STEP 2: Deploy Libraries
5062
deploy-libs :
51-
make deploy-libs-one chain=${chain}
52-
npx catapulta-verify -b broadcast/LibraryPreCompileOne.sol/${chainId}/run-latest.json
53-
make deploy-libs-two chain=${chain}
54-
npx catapulta-verify -b broadcast/LibraryPreCompileTwo.sol/${chainId}/run-latest.json
55-
63+
make deploy-libs-one
64+
make deploy-libs-two
65+
66+
# STEP 3: Deploy Pool Contracts once libraries are deployed and updated on .env
67+
deploy-v3-batched-broadcast :;
68+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/DeployAaveV3MarketBatched.sol:Default \
69+
--rpc-url ${CHAIN} --sender $$(cast wallet address --account ${ACCOUNT}) --account ${ACCOUNT} --slow --broadcast --gas-estimate-multiplier 150 \
70+
--verify --chain ${CHAIN} --verifier-url ${VERIFIER_URL} -vvvv
71+
72+
# STEP 4: Deploys payload to list phase one assets. `make deploy-phase-one-payload reportPath=<PATH_TO_REPORT>`
73+
deploy-phase-one-payload :;
74+
FOUNDRY_PROFILE=${CHAIN} forge script scripts/misc/DeployHorizonPhaseOnePayload.sol:DeployHorizonPhaseOnePayload \
75+
--rpc-url ${CHAIN} --account ${ACCOUNT} --slow --broadcast --gas-estimate-multiplier 150 \
76+
--verify --chain ${CHAIN} --verifier-url ${VERIFIER_URL} \
77+
--sig "run(string)" ${reportPath}
5678

5779
# Invariants
5880
echidna:

foundry.toml

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ optimizer_runs = 200
77
solc = '0.8.22'
88
evm_version = 'shanghai'
99
bytecode_hash = 'none'
10-
ignored_warnings_from = ["src/periphery/contracts/treasury/RevenueSplitter.sol"]
10+
ignored_warnings_from = [
11+
"src/contracts/treasury/RevenueSplitter.sol",
12+
"src/contracts/dependencies/openzeppelin/ReentrancyGuard.sol",
13+
]
1114
out = 'out'
1215
libs = ['lib']
1316
remappings = []
1417
fs_permissions = [
15-
{ access = "write", path = "./reports" },
18+
{ access = "read-write", path = "./reports" },
1619
{ access = "read", path = "./out" },
1720
{ access = "read", path = "./config" },
1821
]
@@ -34,33 +37,25 @@ arbitrum = "${RPC_ARBITRUM}"
3437
fantom = "${RPC_FANTOM}"
3538
scroll = "${RPC_SCROLL}"
3639
celo = "${RPC_CELO}"
37-
fantom_testnet = "${RPC_FANTOM_TESTNET}"
38-
harmony = "${RPC_HARMONY}"
39-
sepolia = "${RPC_SEPOLIA}"
40-
mumbai = "${RPC_MUMBAI}"
41-
amoy = "${RPC_AMOY}"
42-
bnb_testnet = "${RPC_BNB_TESTNET}"
4340
bnb = "${RPC_BNB}"
4441
gnosis = "${RPC_GNOSIS}"
4542
base = "${RPC_BASE}"
4643
metis = "${RPC_METIS}"
4744
linea = "${RPC_LINEA}"
45+
sepolia = "${RPC_SEPOLIA}"
4846

4947
[etherscan]
50-
mainnet = { key = "${ETHERSCAN_API_KEY_MAINNET}", chainId = 1 }
51-
optimism = { key = "${ETHERSCAN_API_KEY_OPTIMISM}", chainId = 10 }
52-
avalanche = { key = "${ETHERSCAN_API_KEY_AVALANCHE}", chainId = 43114 }
53-
polygon = { key = "${ETHERSCAN_API_KEY_POLYGON}", chainId = 137 }
54-
arbitrum = { key = "${ETHERSCAN_API_KEY_ARBITRUM}", chainId = 42161 }
55-
# fantom = { key = "${ETHERSCAN_API_KEY_FANTOM}", chainId = 250 }
56-
scroll = { key = "${ETHERSCAN_API_KEY_SCROLL}", chainId = 534352, url = 'https://api.scrollscan.com/api\?' }
57-
# celo = { key = "${ETHERSCAN_API_KEY_CELO}", chainId = 42220 }
58-
# sepolia = { key = "${ETHERSCAN_API_KEY_MAINNET}", chainId = 11155111 }
59-
# mumbai = { key = "${ETHERSCAN_API_KEY_POLYGON}", chainId = 80001 }
60-
# amoy = { key = "${ETHERSCAN_API_KEY_POLYGON}", chainId = 80002 }
61-
# bnb_testnet = { key = "${ETHERSCAN_API_KEY_BNB}", chainId = 97, url = 'https://api-testnet.bscscan.com/api' }
62-
bnb = { key = "${ETHERSCAN_API_KEY_BNB}", chainId = 56, url = 'https://api.bscscan.com/api' }
63-
base = { key = "${ETHERSCAN_API_KEY_BASE}", chain = 8453 }
64-
gnosis = { key = "${ETHERSCAN_API_KEY_GNOSIS}", chainId = 100 }
48+
mainnet = { key = "${ETHERSCAN_API_KEY}", chainId = 1 }
49+
optimism = { key = "${ETHERSCAN_API_KEY}", chainId = 10 }
50+
avalanche = { key = "${ETHERSCAN_API_KEY}", chainId = 43114 }
51+
polygon = { key = "${ETHERSCAN_API_KEY}", chainId = 137 }
52+
arbitrum = { key = "${ETHERSCAN_API_KEY}", chainId = 42161 }
53+
fantom = { key = "${ETHERSCAN_API_KEY}", chainId = 250 }
54+
scroll = { key = "${ETHERSCAN_API_KEY}", chainId = 534352 }
55+
celo = { key = "${ETHERSCAN_API_KEY}", chainId = 42220 }
56+
bnb = { key = "${ETHERSCAN_API_KEY}", chainId = 56 }
57+
gnosis = { key = "${ETHERSCAN_API_KEY}", chainId = 100 }
58+
base = { key = "${ETHERSCAN_API_KEY}", chain = 8453 }
6559
metis = { key = "", chainId = 1088, url = 'https://api.routescan.io/v2/network/mainnet/evm/1088/etherscan/api' }
66-
# See more config options https://github.com/gakonst/foundry/tree/master/config
60+
linea = { key = "${ETHERSCAN_API_KEY}", chainId = 59144 }
61+
sepolia = { key = "${ETHERSCAN_API_KEY}", chainId = 11155111 }

remappings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ forge-std/=lib/forge-std/src/
33
ds-test/=lib/forge-std/lib/ds-test/src/
44
openzeppelin-contracts-upgradeable/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/
55
openzeppelin-contracts/=lib/solidity-utils/lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/
6+
aave-address-book/=lib/aave-address-book/src/
7+
aave-v3-origin/=lib/aave-address-book/lib/aave-v3-origin/src/

scripts/DeployAaveV3MarketBatched.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ pragma solidity ^0.8.0;
33

44
import {DeployAaveV3MarketBatchedBase} from './misc/DeployAaveV3MarketBatchedBase.sol';
55

6-
import {DefaultMarketInput} from '../src/deployments/inputs/DefaultMarketInput.sol';
6+
import {HorizonInput} from '../src/deployments/inputs/HorizonInput.sol';
77

8-
contract Default is DeployAaveV3MarketBatchedBase, DefaultMarketInput {}
8+
contract Default is DeployAaveV3MarketBatchedBase, HorizonInput {}

scripts/misc/DeployAaveV3MarketBatchedBase.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {MarketInput} from '../../src/deployments/inputs/MarketInput.sol';
1414
abstract contract DeployAaveV3MarketBatchedBase is DeployUtils, MarketInput, Script {
1515
using stdJson for string;
1616

17-
function run() external {
17+
function run() public returns (string memory reportFilePath) {
1818
Roles memory roles;
1919
MarketConfig memory config;
2020
DeployFlags memory flags;
@@ -35,7 +35,7 @@ abstract contract DeployAaveV3MarketBatchedBase is DeployUtils, MarketInput, Scr
3535
IMetadataReporter metadataReporter = IMetadataReporter(
3636
_deployFromArtifacts('MetadataReporter.sol:MetadataReporter')
3737
);
38-
metadataReporter.writeJsonReportMarket(report);
38+
return metadataReporter.writeJsonReportMarket(report);
3939
}
4040

4141
function _loadWarnings(MarketConfig memory config, DeployFlags memory flags) internal pure {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
pragma solidity ^0.8.0;
3+
4+
import {MarketReport} from '../../src/deployments/interfaces/IMarketReportTypes.sol';
5+
import {HorizonPhaseOneListing} from '../../src/deployments/inputs/HorizonPhaseOneListing.sol';
6+
import {IMetadataReporter} from '../../src/deployments/interfaces/IMetadataReporter.sol';
7+
import {DeployUtils} from '../../src/deployments/contracts/utilities/DeployUtils.sol';
8+
import {HorizonInput} from '../../src/deployments/inputs/HorizonInput.sol';
9+
import {Script} from 'forge-std/Script.sol';
10+
11+
contract DeployHorizonPhaseOnePayload is Script, DeployUtils, HorizonInput {
12+
function run(string memory reportPath) public returns (address) {
13+
IMetadataReporter metadataReporter = IMetadataReporter(
14+
_deployFromArtifacts('MetadataReporter.sol:MetadataReporter')
15+
);
16+
MarketReport memory report = metadataReporter.parseMarketReport(reportPath);
17+
18+
vm.startBroadcast();
19+
HorizonPhaseOneListing horizonInitialListing = new HorizonPhaseOneListing(report);
20+
vm.stopBroadcast();
21+
22+
return address(horizonInitialListing);
23+
}
24+
}

0 commit comments

Comments
 (0)