Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/data store withdrawal #692

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"cSpell.words": [
"oneshot"
]
}
1 change: 1 addition & 0 deletions book/src/smart-contracts-architecture/mock-module.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Mock Module
8 changes: 8 additions & 0 deletions book/src/smart-contracts-architecture/satoru.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "../../.."
}
],
"settings": {}
}
30 changes: 23 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
{
"dependencies": {
"@types/node": "^20.11.16",
"dotenv": "^16.4.1",
"starknet": "^6.6.6",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
"scripts": {
"1": "ts-node ./scripts/1.deployApp.ts",
"2": "ts-node ./scripts/2.grantRoles.ts",
"3": "ts-node ./scripts/3.createMarket.ts",
"4": "ts-node ./scripts/4.configMarket.ts",
"5": "ts-node ./scripts/5.createDeposit.ts",
"6": "ts-node ./scripts/6.executeDeposit.ts",
"7": "ts-node ./scripts/7.createLongOrder.ts",
"8": "ts-node ./scripts/8.executeLongOrder.ts",
"noDeployFlow": "ts-node ./scripts/2.grantRoles.ts && sleep 30 && ts-node ./scripts/3.createMarket.ts && ts-node ./scripts/4.configMarket.ts && ts-node ./scripts/5.createDeposit.ts && sleep 120 && ts-node ./scripts/6.executeDeposit.ts && sleep 30 && ts-node ./scripts/7.createLongOrder.ts && ts-node ./scripts/8.executeLongOrder.ts",
"fullDeployFlow": "ts-node ./scripts/1.deployApp.ts && sleep 30 && ts-node ./scripts/2.grantRoles.ts && sleep 30 && ts-node ./scripts/3.createMarket.ts && sleep 30 && ts-node ./scripts/4.configMarket.ts && sleep 30 && ts-node ./scripts/5.createDeposit.ts && sleep 120 && ts-node ./scripts/6.executeDeposit.ts && sleep 30 && ts-node ./scripts/7.createLongOrder.ts && sleep 30 && ts-node ./scripts/8.executeLongOrder.ts",
"customFlow": "ts-node ./scripts/1.deployApp.ts && sleep 30 && ts-node ./scripts/2.grantRoles.ts && sleep 30 && ts-node ./scripts/3.createMarket.ts && sleep 30 && ts-node ./scripts/4.configMarket.ts && sleep 30 && ts-node ./scripts/5.createDeposit.ts && sleep 120 && ts-node ./scripts/6.executeDeposit.ts"

},
"dependencies": {
"@types/node": "^20.11.16",
"dotenv": "^16.4.5",
"ethers": "5",
"fs": "^0.0.1-security",
"starknet": "^6.11.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
}
}
315 changes: 152 additions & 163 deletions scripts/app/deployApp.ts → scripts/1.deployApp.ts

Large diffs are not rendered by default.

144 changes: 144 additions & 0 deletions scripts/2.grantRoles.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { Account, hash, Contract, json, Calldata, CallData, RpcProvider, shortString, ec } from "starknet"
import fs from 'fs'
import path from 'path';
import dotenv from 'dotenv'
import { sleep, tryInvoke } from "./constants/utils"

const contractAddressesPath = path.join(__dirname, 'constants', 'contractAddresses.json');
const contractAddresses = JSON.parse(fs.readFileSync(contractAddressesPath, 'utf8'));

dotenv.config()

async function deploy() {
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 tedAccountAddress: string = '0x48b7fa2d7519ead304594b4006cbaaeaf3d3ce34b7c7e88a20939d953679521';
const account0 = new Account(provider, account0Address!, privateKey0!)

const grantRoleCalls: Array<{ contractAddress: string, entrypoint: string, calldata: any[] }> = [
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [account0Address, shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [account0Address, shortString.encodeShortString("MARKET_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [account0Address, shortString.encodeShortString("ORDER_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [account0Address, shortString.encodeShortString("FROZEN_ORDER_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [tedAccountAddress, shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [tedAccountAddress, shortString.encodeShortString("MARKET_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [tedAccountAddress, shortString.encodeShortString("ORDER_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [tedAccountAddress, shortString.encodeShortString("FROZEN_ORDER_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['MarketFactory'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['MarketFactory'], shortString.encodeShortString("MARKET_KEEPER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['OrderHandler'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['IncreaseOrderUtils'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['DecreaseOrderUtils'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['SwapOrderUtils'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['DepositHandler'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['WithdrawalHandler'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['SwapHandler'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['ExchangeRouter'], shortString.encodeShortString("CONTROLLER")]
},
{
contractAddress: contractAddresses['RoleStore'],
entrypoint: "grant_role",
calldata: [contractAddresses['OrderUtils'], shortString.encodeShortString("CONTROLLER")]
},
];
await tryInvoke("Grant Roles", grantRoleCalls);

sleep(30);

const dataStoreAddress = contractAddresses['DataStore'];
const compiledDataStoreSierra = json.parse(fs.readFileSync( "./target/dev/satoru_DataStore.contract_class.json").toString( "ascii"))
const dataStoreContract = new Contract(compiledDataStoreSierra.abi, dataStoreAddress, provider)
dataStoreContract.connect(account0);
const dataCall = dataStoreContract.populate(
"set_address",
[ec.starkCurve.poseidonHashMany([BigInt(shortString.encodeShortString("FEE_TOKEN"))]), contractAddresses['ETH']])
const setAddressTx = await dataStoreContract.set_address(dataCall.calldata)
await provider.waitForTransaction(setAddressTx.transaction_hash)
const dataCall2 = dataStoreContract.populate(
"set_u256",
[ec.starkCurve.poseidonHashMany([BigInt(shortString.encodeShortString("MAX_SWAP_PATH_LENGTH"))]), 5n])
const setAddressTx2 = await dataStoreContract.set_u256(dataCall2.calldata)
await provider.waitForTransaction(setAddressTx2.transaction_hash)

const dataCall3 = dataStoreContract.populate(
"set_u256",
[ec.starkCurve.poseidonHashMany([BigInt(shortString.encodeShortString("MAX_ORACLE_PRICE_AGE"))]), 1000000000000n])
const setAddressTx3 = await dataStoreContract.set_u256(dataCall3.calldata)
await provider.waitForTransaction(setAddressTx2.transaction_hash)
}

deploy()
58 changes: 58 additions & 0 deletions scripts/3.createMarket.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Account, Contract, json, Calldata, CallData, RpcProvider, shortString, uint256, CairoCustomEnum, ec } from "starknet"
import fs from 'fs'
import dotenv from 'dotenv'
import path from 'path';
import { tryInvoke } from "./constants/utils";

const contractAddressesPath = path.join(__dirname, 'constants', 'contractAddresses.json');
const contractAddresses = JSON.parse(fs.readFileSync(contractAddressesPath, 'utf8'));
const ETH = contractAddresses['ETH'];
const BTC = contractAddresses['BTC'];
const USDT = contractAddresses['USDT'];

dotenv.config()

async function create_market() {
// 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!)

const marketFactoryAddress = contractAddresses['MarketFactory'];
const compiledMarketFactorySierra = json.parse(fs.readFileSync("./target/dev/satoru_MarketFactory.contract_class.json").toString("ascii"))
const abi = compiledMarketFactorySierra.abi
const marketFactoryContract = new Contract(abi, marketFactoryAddress, provider);
marketFactoryContract.connect(account0)

console.log("Creating ETH-USDT and BTC-USDT Markets...")
const myCall = marketFactoryContract.populate("create_market", [
ETH,
ETH,
USDT,
"market_type"
]);
const res = await marketFactoryContract.create_market(myCall.calldata);
const marketTokenAddress = (await provider.waitForTransaction(res.transaction_hash) as any).events[0].data[1];

const myCall1 = marketFactoryContract.populate("create_market", [
BTC,
BTC,
USDT,
"market_type"
]);
const res1 = await marketFactoryContract.create_market(myCall1.calldata);
const marketTokenAddress1 = (await provider.waitForTransaction(res1.transaction_hash) as any).events[0].data[1];

contractAddresses.ETHUSDTMarketToken = marketTokenAddress;
fs.writeFileSync(contractAddressesPath, JSON.stringify(contractAddresses, null, 4), 'utf8');

contractAddresses.BTCUSDTMarketToken = marketTokenAddress1;
fs.writeFileSync(contractAddressesPath, JSON.stringify(contractAddresses, null, 4), 'utf8');

console.log('Markets created ✅\n')
}

create_market()
Loading
Loading