Skip to content

Commit

Permalink
feat: full deployment script in ts (#613)
Browse files Browse the repository at this point in the history
* feat: deployment script in ts

* fix: add checks for undefined values
  • Loading branch information
zarboq authored Feb 13, 2024
1 parent 0e8cda3 commit 92a4571
Show file tree
Hide file tree
Showing 34 changed files with 475 additions and 37 deletions.
3 changes: 3 additions & 0 deletions .example.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PROVIDER_URL=
ACCOUNT_PUBLIC=
ACCOUNT_PRIVATE=
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ Cargo.lock
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb

**/.DS_Store
**/.DS_Store
.env
node_modules
9 changes: 9 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"dependencies": {
"@types/node": "^20.11.16",
"dotenv": "^16.4.1",
"starknet": "^5.24.3",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
}
206 changes: 206 additions & 0 deletions scripts/app/deployApp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
import { Account, hash, Contract, json, Calldata, CallData, RpcProvider, shortString } from "starknet"
import fs from 'fs'
import dotenv from 'dotenv'

dotenv.config()

async function deploy() {
// connect provider
const providerUrl = process.env.PROVIDER_URL
const provider = new RpcProvider({ nodeUrl: providerUrl! })
// connect your account. To adapt to your own account :
const privateKey0: string = process.env.ACCOUNT_PRIVATE as string
const account0Address: string = process.env.ACCOUNT_PUBLIC as string
const account0 = new Account(provider, account0Address!, privateKey0!)
console.log("Deploying with Account: " + account0Address)

console.log("Deploying RoleStore...")
const compiledRoleStoreCasm = json.parse(fs.readFileSync( "./target/dev/satoru_RoleStore.compiled_contract_class.json").toString( "ascii"))
const compiledRoleStoreSierra = json.parse(fs.readFileSync( "./target/dev/satoru_RoleStore.contract_class.json").toString( "ascii"))
const roleStoreCallData: CallData = new CallData(compiledRoleStoreSierra.abi)
const roleStoreConstructor: Calldata = roleStoreCallData.compile("constructor", { admin: account0.address })
const deployRoleStoreResponse = await account0.declareAndDeploy({
contract: compiledRoleStoreSierra,
casm: compiledRoleStoreCasm,
constructorCalldata: roleStoreConstructor
})
console.log("RoleStore Deployed.")

console.log("Deploying DataStore...")
const compiledDataStoreCasm = json.parse(fs.readFileSync( "./target/dev/satoru_DataStore.compiled_contract_class.json").toString( "ascii"))
const compiledDataStoreSierra = json.parse(fs.readFileSync( "./target/dev/satoru_DataStore.contract_class.json").toString( "ascii"))
const dataStoreCallData: CallData = new CallData(compiledDataStoreSierra.abi)
const dataStoreConstructor: Calldata = dataStoreCallData.compile("constructor", {
role_store_address: deployRoleStoreResponse.deploy.contract_address
})
const deployDataStoreResponse = await account0.declareAndDeploy({
contract: compiledDataStoreSierra,
casm: compiledDataStoreCasm ,
constructorCalldata: dataStoreConstructor,
})
console.log("DataStore Deployed.")

console.log("Granting Controller role...")
const roleStoreContract = new Contract(compiledRoleStoreSierra.abi, deployRoleStoreResponse.deploy.contract_address, provider)
roleStoreContract.connect(account0);
const roleCall = roleStoreContract.populate("grant_role", [account0.address, shortString.encodeShortString("CONTROLLER")])
const grant_role_tx = await roleStoreContract.grant_role(roleCall.calldata)
await provider.waitForTransaction(grant_role_tx.transaction_hash)
console.log("Controller role granted.")

console.log("Deploying EventEmitter...")
const compiledEventEmitterCasm = json.parse(fs.readFileSync( "./target/dev/satoru_EventEmitter.compiled_contract_class.json").toString( "ascii"))
const compiledEventEmitterSierra = json.parse(fs.readFileSync( "./target/dev/satoru_EventEmitter.contract_class.json").toString( "ascii"))
const eventEmitterCallData: CallData = new CallData(compiledEventEmitterSierra.abi)
const eventEmitterConstructor: Calldata = eventEmitterCallData.compile("constructor", {})
const deployEventEmitterResponse = await account0.declareAndDeploy({
contract: compiledEventEmitterSierra,
casm: compiledEventEmitterCasm ,
constructorCalldata: eventEmitterConstructor,
})
console.log("EventEmitter Deployed.")

console.log("Deploying OracleStore...")
const compiledOracleStoreCasm = json.parse(fs.readFileSync( "./target/dev/satoru_OracleStore.compiled_contract_class.json").toString( "ascii"))
const compiledOracleStoreSierra = json.parse(fs.readFileSync( "./target/dev/satoru_OracleStore.contract_class.json").toString( "ascii"))
const oracleStoreCallData: CallData = new CallData(compiledOracleStoreSierra.abi)
const oracleStoreConstructor: Calldata = oracleStoreCallData.compile("constructor", {
role_store_address: deployRoleStoreResponse.deploy.contract_address,
event_emitter_address: deployEventEmitterResponse.deploy.contract_address
})
const deployOracleStoreResponse = await account0.declareAndDeploy({
contract: compiledOracleStoreSierra,
casm: compiledOracleStoreCasm ,
constructorCalldata: oracleStoreConstructor,
})
console.log("OracleStore Deployed.")

console.log("Deploying Oracle...")
const compiledOracleCasm = json.parse(fs.readFileSync( "./target/dev/satoru_Oracle.compiled_contract_class.json").toString( "ascii"))
const compiledOracleSierra = json.parse(fs.readFileSync( "./target/dev/satoru_Oracle.contract_class.json").toString( "ascii"))
const oracleCallData: CallData = new CallData(compiledOracleSierra.abi)
const oracleConstructor: Calldata = oracleCallData.compile("constructor", {
role_store_address: deployRoleStoreResponse.deploy.contract_address,
oracle_store_address: deployOracleStoreResponse.deploy.contract_address,
pragma_address: account0.address
})
const deployOracleResponse = await account0.declareAndDeploy({
contract: compiledOracleSierra,
casm: compiledOracleCasm ,
constructorCalldata: oracleConstructor,
})
console.log("Oracle Deployed.")

console.log("Deploying OrderVault...")
const compiledOrderVaultCasm = json.parse(fs.readFileSync( "./target/dev/satoru_OrderVault.compiled_contract_class.json").toString( "ascii"))
const compiledOrderVaultSierra = json.parse(fs.readFileSync( "./target/dev/satoru_OrderVault.contract_class.json").toString( "ascii"))
const orderVaultCallData: CallData = new CallData(compiledOrderVaultSierra.abi)
const orderVaultConstructor: Calldata = orderVaultCallData.compile("constructor", {
data_store_address: deployDataStoreResponse.deploy.contract_address,
role_store_address: deployRoleStoreResponse.deploy.contract_address,
})
const deployOrderVaultResponse = await account0.declareAndDeploy({
contract: compiledOrderVaultSierra,
casm: compiledOrderVaultCasm ,
constructorCalldata: orderVaultConstructor,
})
console.log("OrderVault Deployed.")

console.log("Deploying SwapHandler...")
const compiledSwapHandlerCasm = json.parse(fs.readFileSync( "./target/dev/satoru_SwapHandler.compiled_contract_class.json").toString( "ascii"))
const compiledSwapHandlerSierra = json.parse(fs.readFileSync( "./target/dev/satoru_SwapHandler.contract_class.json").toString( "ascii"))
const swapHandlerCallData: CallData = new CallData(compiledSwapHandlerSierra.abi)
const swapHandlerConstructor: Calldata = swapHandlerCallData.compile("constructor", {
role_store_address: deployRoleStoreResponse.deploy.contract_address,
})
const deploySwapHandlerResponse = await account0.declareAndDeploy({
contract: compiledSwapHandlerSierra,
casm: compiledSwapHandlerCasm ,
constructorCalldata: swapHandlerConstructor,
})
console.log("SwapHandler Deployed.")

console.log("Deploying ReferralStorage...")
const compiledReferralStorageCasm = json.parse(fs.readFileSync( "./target/dev/satoru_ReferralStorage.compiled_contract_class.json").toString( "ascii"))
const compiledReferralStorageSierra = json.parse(fs.readFileSync( "./target/dev/satoru_ReferralStorage.contract_class.json").toString( "ascii"))
const referralStorageCallData: CallData = new CallData(compiledReferralStorageSierra.abi)
const referralStorageConstructor: Calldata = referralStorageCallData.compile("constructor", {
event_emitter_address: deployEventEmitterResponse.deploy.contract_address,
})
const deployReferralStorageResponse = await account0.declareAndDeploy({
contract: compiledReferralStorageSierra,
casm: compiledReferralStorageCasm ,
constructorCalldata: referralStorageConstructor,
})
console.log("ReferralStorage Deployed.")

console.log("Deploying OrderHandler...")
const compiledOrderHandlerCasm = json.parse(fs.readFileSync( "./target/dev/satoru_OrderHandler.compiled_contract_class.json").toString( "ascii"))
const compiledOrderHandlerSierra = json.parse(fs.readFileSync( "./target/dev/satoru_OrderHandler.contract_class.json").toString( "ascii"))
const orderHandlerCallData: CallData = new CallData(compiledOrderHandlerSierra.abi)
const orderHandlerConstructor: Calldata = orderHandlerCallData.compile("constructor", {
data_store_address: deployDataStoreResponse.deploy.contract_address,
role_store_address: deployRoleStoreResponse.deploy.contract_address,
event_emitter_address: deployEventEmitterResponse.deploy.contract_address,
order_vault_address: deployOrderVaultResponse.deploy.contract_address,
oracle_address: deployOracleResponse.deploy.contract_address,
swap_handler_address: deploySwapHandlerResponse.deploy.contract_address,
referral_storage_address: deployReferralStorageResponse.deploy.contract_address
})
const deployOrderHandlerResponse = await account0.declareAndDeploy({
contract: compiledOrderHandlerSierra,
casm: compiledOrderHandlerCasm ,
constructorCalldata: orderHandlerConstructor,
})
console.log("OrderHandler Deployed.")

console.log("Declaring MarketToken...")
const compiledMarketTokenCasm = json.parse(fs.readFileSync( "./target/dev/satoru_MarketToken.compiled_contract_class.json").toString( "ascii"))
const compiledMarketTokenSierra = json.parse(fs.readFileSync( "./target/dev/satoru_MarketToken.contract_class.json").toString( "ascii"))
try {
account0.declare({
contract: compiledMarketTokenSierra,
casm: compiledMarketTokenCasm
})
console.log("MarketToken Declared.")
} catch (error) {
console.log("Already Declared.")
}

console.log("Deploying MarketFactory...")
const marketTokenClassHash = hash.computeCompiledClassHash(compiledMarketTokenCasm)
const compiledMarketFactoryCasm = json.parse(fs.readFileSync( "./target/dev/satoru_MarketFactory.compiled_contract_class.json").toString( "ascii"))
const compiledMarketFactorySierra = json.parse(fs.readFileSync( "./target/dev/satoru_MarketFactory.contract_class.json").toString( "ascii"))
const marketFactoryCallData: CallData = new CallData(compiledMarketFactorySierra.abi)
const marketFactoryConstructor: Calldata = marketFactoryCallData.compile("constructor", {
data_store_address: deployDataStoreResponse.deploy.contract_address,
role_store_address: deployRoleStoreResponse.deploy.contract_address,
event_emitter_address: deployEventEmitterResponse.deploy.contract_address,
market_token_class_hash: marketTokenClassHash
})
const deployMarketFactoryResponse = await account0.declareAndDeploy({
contract: compiledMarketFactorySierra,
casm: compiledMarketFactoryCasm ,
constructorCalldata: marketFactoryConstructor,
})
console.log("MarketFactory Deployed.")

console.log("Granting roles...")
const roleCall2 = roleStoreContract.populate("grant_role", [account0.address, shortString.encodeShortString("MARKET_KEEPER")])
const roleCall3 = roleStoreContract.populate("grant_role", [account0.address, shortString.encodeShortString("ORDER_KEEPER")])
const roleCall4 = roleStoreContract.populate("grant_role",
[
deployOrderHandlerResponse.deploy.contract_address,
shortString.encodeShortString("CONTROLLER")
]
)
const grant_role_tx2 = await roleStoreContract.grant_role(roleCall2.calldata)
await provider.waitForTransaction(grant_role_tx2.transaction_hash)
const grant_role_tx3 = await roleStoreContract.grant_role(roleCall3.calldata)
await provider.waitForTransaction(grant_role_tx3.transaction_hash)
const grant_role_tx4 = await roleStoreContract.grant_role(roleCall4.calldata)
await provider.waitForTransaction(grant_role_tx4.transaction_hash)
console.log("Roles granted.")
}

deploy()
7 changes: 1 addition & 6 deletions src/exchange/order_handler.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
// *************************************************************************

// Core lib imports.
use core::traits::Into;
use starknet::ContractAddress;
// Local imports.
use satoru::oracle::oracle_utils::{SetPricesParams, SimulatePricesParams};
Expand Down Expand Up @@ -101,9 +100,7 @@ mod OrderHandler {
// *************************************************************************

// Core lib imports.
use core::option::OptionTrait;
use core::starknet::SyscallResultTrait;
use core::traits::Into;
use starknet::ContractAddress;
use starknet::{get_caller_address, get_contract_address};
use array::ArrayTrait;
Expand All @@ -113,12 +110,11 @@ mod OrderHandler {
use satoru::oracle::{
oracle_modules, oracle_utils, oracle_utils::{SetPricesParams, SimulatePricesParams}
};
use satoru::order::{base_order_utils::CreateOrderParams, order_utils, order, base_order_utils};
use satoru::order::{
base_order_utils::CreateOrderParams, order_utils, order, base_order_utils,
order::{Order, OrderTrait, OrderType, SecondaryOrderType},
order_vault::{IOrderVaultDispatcher, IOrderVaultDispatcherTrait}
};
use satoru::market::market::Market;
use satoru::market::error::MarketError;
use satoru::position::error::PositionError;
use satoru::feature::error::FeatureError;
Expand All @@ -143,7 +139,6 @@ mod OrderHandler {
use satoru::role::role_store::{IRoleStoreDispatcher, IRoleStoreDispatcherTrait};
use satoru::token::token_utils;
use satoru::gas::gas_utils;
use satoru::chain::chain::Chain;
use satoru::utils::global_reentrancy_guard;
use satoru::utils::error_utils;

Expand Down
5 changes: 2 additions & 3 deletions src/role/role_store.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,9 @@ mod RoleStore {
// CONSTRUCTOR
// *************************************************************************
#[constructor]
fn constructor(ref self: ContractState) {
let caller = get_caller_address();
fn constructor(ref self: ContractState, admin: ContractAddress) {
// Grant the caller admin role.
self._grant_role(caller, role::ROLE_ADMIN);
self._grant_role(admin, role::ROLE_ADMIN);
// Initialize the role_count to 1 due to the line just above.
}

Expand Down
2 changes: 1 addition & 1 deletion src/tests_lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ fn deploy_swap_handler_address(
/// * `ContractAddress` - The address of the deployed role store contract.
fn deploy_role_store() -> ContractAddress {
let contract = declare('RoleStore');
deploy_mock_contract(contract, @array![])
deploy_mock_contract(contract, @array![contract_address_const::<'caller'>().into()])
}

/// Utility function to deploy a `EventEmitter` contract and return its dispatcher.
Expand Down
2 changes: 1 addition & 1 deletion tests/bank/test_bank.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ fn setup() -> (
let role_store_address = contract_address_const::<'role_store'>();
start_prank(role_store_address, caller_address);
let role_store_contract_address = role_store_contract
.deploy_at(@array![], role_store_address)
.deploy_at(@array![caller_address.into()], role_store_address)
.unwrap();
let role_store_dispatcher = IRoleStoreDispatcher {
contract_address: role_store_contract_address
Expand Down
2 changes: 1 addition & 1 deletion tests/bank/test_strict_bank.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let role_store_address: ContractAddress = contract_address_const::<'role_store'>();

let constructor_arguments: @Array::<felt252> = @ArrayTrait::new();
let constructor_arguments: @Array::<felt252> = @array![caller_address.into()];
start_prank(role_store_address, caller_address);
contract.deploy_at(constructor_arguments, role_store_address).unwrap()
}
Expand Down
2 changes: 1 addition & 1 deletion tests/config/test_config.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address = contract_address_const::<'caller'>();
let role_store_address = contract_address_const::<'role_store'>();
start_prank(role_store_address, caller_address);
let constructor_arguments: @Array::<felt252> = @ArrayTrait::new();
let constructor_arguments: @Array::<felt252> = @array![caller_address.into()];
contract.deploy_at(constructor_arguments, role_store_address).unwrap()
}

Expand Down
1 change: 0 additions & 1 deletion tests/data/test_data_store.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use starknet::{ContractAddress, contract_address_const};

use satoru::data::data_store::IDataStoreDispatcherTrait;
use satoru::role::role_store::IRoleStoreDispatcherTrait;
use satoru::order::order::{Order, OrderType, OrderTrait};
use satoru::tests_lib::{setup, teardown};
use satoru::utils::i128::{i128, i128_new};
Expand Down
2 changes: 1 addition & 1 deletion tests/data/test_deposit_store.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let deployed_contract_address: ContractAddress = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, caller_address);
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap()
}


Expand Down
2 changes: 1 addition & 1 deletion tests/data/test_market.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let deployed_contract_address: ContractAddress = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, caller_address);
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap()
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion tests/data/test_withdrawal.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let deployed_contract_address: ContractAddress = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, caller_address);
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap()
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion tests/exchange/test_deposit_handler.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let deployed_contract_address = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, caller_address);
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap()
}

fn deploy_event_emitter() -> ContractAddress {
Expand Down
2 changes: 1 addition & 1 deletion tests/exchange/test_liquidation_handler.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ fn deploy_role_store() -> ContractAddress {
let contract = declare('RoleStore');
let deployed_contract_address: ContractAddress = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, admin());
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![admin().into()], deployed_contract_address).unwrap()
}

fn deploy_price_feed() -> ContractAddress {
Expand Down
2 changes: 1 addition & 1 deletion tests/exchange/test_withdrawal_handler.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ fn deploy_role_store() -> ContractAddress {
let caller_address: ContractAddress = contract_address_const::<'caller'>();
let deployed_contract_address = contract_address_const::<'role_store'>();
start_prank(deployed_contract_address, caller_address);
contract.deploy_at(@array![], deployed_contract_address).unwrap()
contract.deploy_at(@array![caller_address.into()], deployed_contract_address).unwrap()
}

fn deploy_event_emitter() -> ContractAddress {
Expand Down
Loading

0 comments on commit 92a4571

Please sign in to comment.