Commit 1a73cdfa authored by Hayden Adams's avatar Hayden Adams

first deployment w/ visualization and investment

parent 994933f9
...@@ -306,3 +306,7 @@ input[type=number]::-webkit-outer-spin-button { ...@@ -306,3 +306,7 @@ input[type=number]::-webkit-outer-spin-button {
position: relative; position: relative;
left: -5px; left: -5px;
} }
.visualization {
font-family: "Inter UI", sans-serif;
}
...@@ -15,7 +15,7 @@ import About from './components/About'; ...@@ -15,7 +15,7 @@ import About from './components/About';
import Links from './components/Links'; import Links from './components/Links';
import SharePurchase from './components/SharePurchase'; import SharePurchase from './components/SharePurchase';
import Transactions from './components/Transactions'; import Transactions from './components/Transactions';
// d3 // d3
import Visualization from './components/Visualization'; import Visualization from './components/Visualization';
// enter redux // enter redux
import { bindActionCreators } from 'redux' import { bindActionCreators } from 'redux'
...@@ -40,6 +40,7 @@ import { setInputBalance, ...@@ -40,6 +40,7 @@ import { setInputBalance,
setInvestEthPool, setInvestEthPool,
setInvestTokenPool, setInvestTokenPool,
setInvestShares, setInvestShares,
setUserShares,
setInvestTokenBalance, setInvestTokenBalance,
setInvestEthBalance } from './actions/exchange-actions'; setInvestEthBalance } from './actions/exchange-actions';
// enter d3 & misc. tools // enter d3 & misc. tools
...@@ -261,6 +262,10 @@ class App extends Component { ...@@ -261,6 +262,10 @@ class App extends Component {
this.props.setInvestShares(result); this.props.setInvestShares(result);
}); });
exchange.methods.getShares(this.props.web3Store.currentMaskAddress).call().then((result, error) => {
this.props.setUserShares(result);
});
token.methods.balanceOf(this.props.web3Store.currentMaskAddress).call((error, balance) => { token.methods.balanceOf(this.props.web3Store.currentMaskAddress).call((error, balance) => {
this.props.setInvestTokenBalance(balance); this.props.setInvestTokenBalance(balance);
}); });
...@@ -455,11 +460,11 @@ class App extends Component { ...@@ -455,11 +460,11 @@ class App extends Component {
inputTokenValue={this.props.exchange.inputToken.value} inputTokenValue={this.props.exchange.inputToken.value}
exchangeFee={this.props.exchange.fee} exchangeFee={this.props.exchange.fee}
/> />
<Visualization />
<Purchase <Purchase
symbolToExchangeContract={this.symbolToExchangeContract} symbolToExchangeContract={this.symbolToExchangeContract}
symbolToTokenAddress={this.symbolToTokenAddress} symbolToTokenAddress={this.symbolToTokenAddress}
/> />
<Visualization />
<Links <Links
toggleInvest={this.toggleInvest} toggleInvest={this.toggleInvest}
location={this} location={this}
...@@ -515,6 +520,7 @@ const mapDispatchToProps = (dispatch) => { ...@@ -515,6 +520,7 @@ const mapDispatchToProps = (dispatch) => {
setInvestTokenPool, setInvestTokenPool,
setInvestInvariant, setInvestInvariant,
setInvestShares, setInvestShares,
setUserShares,
setInvestTokenBalance, setInvestTokenBalance,
setInvestEthBalance setInvestEthBalance
}, dispatch) }, dispatch)
......
...@@ -19,6 +19,7 @@ import { ...@@ -19,6 +19,7 @@ import {
SET_INVEST_ETH_POOL, SET_INVEST_ETH_POOL,
SET_INVEST_TOKEN_POOL, SET_INVEST_TOKEN_POOL,
SET_INVEST_SHARES, SET_INVEST_SHARES,
SET_USER_SHARES,
SET_INVEST_TOKEN_BALANCE, SET_INVEST_TOKEN_BALANCE,
SET_INVEST_ETH_BALANCE, SET_INVEST_ETH_BALANCE,
SET_INVEST_SHARES_INPUT, SET_INVEST_SHARES_INPUT,
...@@ -126,6 +127,10 @@ export const setInvestShares = (investShares) => ({ ...@@ -126,6 +127,10 @@ export const setInvestShares = (investShares) => ({
investShares investShares
}); });
export const setUserShares = (userShares) => ({
type: SET_USER_SHARES,
userShares
});
export const setInvestTokenBalance = (investTokenBalance) => ({ export const setInvestTokenBalance = (investTokenBalance) => ({
type: SET_INVEST_TOKEN_BALANCE, type: SET_INVEST_TOKEN_BALANCE,
......
...@@ -3,7 +3,7 @@ import SelectToken from './SelectToken'; ...@@ -3,7 +3,7 @@ import SelectToken from './SelectToken';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { setInvestToken, setInvestInvariant, setInvestEthPool, setInvestTokenPool, setInvestShares, setInvestTokenBalance, setInvestEthBalance, setInvestSharesInput, setInvestEthRequired, setInvestTokensRequired} from '../actions/exchange-actions'; import { setInvestToken, setInvestInvariant, setInvestEthPool, setInvestTokenPool, setInvestShares, setInvestTokenBalance, setInvestEthBalance, setInvestSharesInput, setUserShares, setInvestEthRequired, setInvestTokensRequired} from '../actions/exchange-actions';
class Invest extends Component { class Invest extends Component {
...@@ -11,6 +11,7 @@ class Invest extends Component { ...@@ -11,6 +11,7 @@ class Invest extends Component {
if(selected.value !== 'ETH') { if(selected.value !== 'ETH') {
await this.props.setInvestToken(selected); await this.props.setInvestToken(selected);
this.getInvestExchangeState(); this.getInvestExchangeState();
this.getInvestBalance();
} else { } else {
this.props.setInvestInvariant(0); this.props.setInvestInvariant(0);
this.props.setInvestTokenPool(0); this.props.setInvestTokenPool(0);
...@@ -18,6 +19,7 @@ class Invest extends Component { ...@@ -18,6 +19,7 @@ class Invest extends Component {
this.props.setInvestTokenBalance(0); this.props.setInvestTokenBalance(0);
this.props.setInvestEthBalance(0); this.props.setInvestEthBalance(0);
this.props.setInvestShares(0); this.props.setInvestShares(0);
this.props.setUserShares(0);
} }
} }
...@@ -48,7 +50,9 @@ class Invest extends Component { ...@@ -48,7 +50,9 @@ class Invest extends Component {
} }
getInvestBalance = () => { getInvestBalance = () => {
console.log('yo');
var token = this.props.symbolToTokenContract(this.props.exchange.investToken.value); var token = this.props.symbolToTokenContract(this.props.exchange.investToken.value);
var exchange = this.props.symbolToExchangeContract(this.props.exchange.investToken.value);
this.props.web3Store.web3.eth.getBalance(this.props.web3Store.currentMaskAddress, (error, balance) => { this.props.web3Store.web3.eth.getBalance(this.props.web3Store.currentMaskAddress, (error, balance) => {
this.props.setInvestEthBalance(balance); this.props.setInvestEthBalance(balance);
...@@ -57,6 +61,11 @@ class Invest extends Component { ...@@ -57,6 +61,11 @@ class Invest extends Component {
token.methods.balanceOf(this.props.web3Store.currentMaskAddress).call((error, balance) => { token.methods.balanceOf(this.props.web3Store.currentMaskAddress).call((error, balance) => {
this.props.setInvestTokenBalance(balance); this.props.setInvestTokenBalance(balance);
}); });
exchange.methods.getShares(this.props.web3Store.currentMaskAddress).call().then((result, error) => {
this.props.setUserShares(result);
console.log(result);
});
} }
getInvestOutput = () => { getInvestOutput = () => {
...@@ -87,22 +96,22 @@ class Invest extends Component { ...@@ -87,22 +96,22 @@ class Invest extends Component {
</div> </div>
<div className="investValue border pa2"> <div className="investValue border pa2">
<p> Total Shares: {this.props.exchange.investShares} </p> <p> Total Shares: {this.props.exchange.investShares} </p>
<p> You own: 0 shares </p> <p> You own: {this.props.exchange.userShares} shares </p>
<p> You get 0% of fees </p> <p> You get {((this.props.exchange.userShares*100)/this.props.exchange.investShares).toFixed(2)} % of fees </p>
</div> </div>
<div className="investValue border pa2"> <div className="investValue border pa2">
<p> Total Liquidity </p> <p> Total Liquidity </p>
<p> {(this.props.exchange.investEthPool/10**18).toFixed(2)} ETH </p> <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{(this.props.exchange.investEthPool/10**18).toFixed(2)} ETH </p>
<p> {(this.props.exchange.investTokenPool/10**18).toFixed(2)} {this.props.exchange.investToken.value} </p> <p> {(this.props.exchange.investTokenPool/10**18).toFixed(2)} {this.props.exchange.investToken.value} </p>
</div> </div>
<div className="investValue border pa2"> <div className="investValue border pa2">
<p> Each share is worth: </p> <p> &nbsp;Each share is worth: </p>
<p> {((this.props.exchange.investEthPool/10**18)/this.props.exchange.investShares).toFixed(5)} ETH </p> <p> {((this.props.exchange.investEthPool/10**18)/this.props.exchange.investShares).toFixed(5)} ETH &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p> {((this.props.exchange.investTokenPool/10**18)/this.props.exchange.investShares).toFixed(5)} {this.props.exchange.investToken.value} </p> <p> {((this.props.exchange.investTokenPool/10**18)/this.props.exchange.investShares).toFixed(5)} {this.props.exchange.investToken.value} </p>
</div> </div>
<div className="investValue border pa2"> <div className="investValue border pa2">
<p> Account Balance: </p> <p> Account Balance: </p>
<p> {(this.props.exchange.investEthBalance/10**18).toFixed(5)} ETH </p> <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{(this.props.exchange.investEthBalance/10**18).toFixed(5)} ETH </p>
<p> {(this.props.exchange.investTokenBalance/10**18).toFixed(5)} {this.props.exchange.investToken.value} </p> <p> {(this.props.exchange.investTokenBalance/10**18).toFixed(5)} {this.props.exchange.investToken.value} </p>
</div> </div>
</section> </section>
...@@ -129,7 +138,8 @@ const mapDispatchToProps = (dispatch) => { ...@@ -129,7 +138,8 @@ const mapDispatchToProps = (dispatch) => {
setInvestEthBalance, setInvestEthBalance,
setInvestSharesInput, setInvestSharesInput,
setInvestEthRequired, setInvestEthRequired,
setInvestTokensRequired setInvestTokensRequired,
setUserShares
}, dispatch); }, dispatch);
} }
......
...@@ -15,7 +15,7 @@ class Links extends Component { ...@@ -15,7 +15,7 @@ class Links extends Component {
<Invest <Invest
toggled={this.props.web3Store.investToggle} toggled={this.props.web3Store.investToggle}
token={this.props.exchange.investToken} token={this.props.exchange.investToken}
symbolToTokenContract={this.symbolToTokenContract} symbolToTokenContract={this.props.symbolToTokenContract}
symbolToExchangeContract={this.props.symbolToExchangeContract} symbolToExchangeContract={this.props.symbolToExchangeContract}
/> />
</div> </div>
......
...@@ -10,12 +10,12 @@ class Visualization extends Component { ...@@ -10,12 +10,12 @@ class Visualization extends Component {
super(props); super(props);
this.state = { this.state = {
data: null data: null
} }
} }
// TODO: find a way to get this thing to listen for changes in the output token // TODO: find a way to get this thing to listen for changes in the output token
componentDidMount() { componentDidMount() {
this.d3Graph = d3.select(ReactDOM.findDOMNode(this.refs.graph)); this.d3Graph = d3.select(ReactDOM.findDOMNode(this.refs.graph));
let inputToken = this.props.exchange.inputToken.value; let inputToken = this.props.exchange.inputToken.value;
let outputToken = this.props.exchange.outputToken.value; let outputToken = this.props.exchange.outputToken.value;
console.log(outputToken, 'output token'); console.log(outputToken, 'output token');
...@@ -28,12 +28,12 @@ class Visualization extends Component { ...@@ -28,12 +28,12 @@ class Visualization extends Component {
}`; }`;
console.log(query, 'query') console.log(query, 'query')
axios.get('http://ec2-18-233-168-186.compute-1.amazonaws.com:3000/graphql', { params: {query: query } }) axios.get('http://ec2-18-233-168-186.compute-1.amazonaws.com:3000/graphql', { params: {query: query } })
.then(data => this.setState({data: data.data.data.Event })) .then(data => this.setState({data: data.data.data.Event }))
.then(() => this.createLineGraph()) .then(() => this.createLineGraph())
.catch(err => console.error(err)); .catch(err => console.error(err));
this.outputTokenSubscriber(); this.outputTokenSubscriber();
} }
...@@ -41,7 +41,7 @@ class Visualization extends Component { ...@@ -41,7 +41,7 @@ class Visualization extends Component {
const outputTokenSubscriber = subscribe('exchange.outputToken', state => { const outputTokenSubscriber = subscribe('exchange.outputToken', state => {
let outputToken = state.exchange.outputToken.value; let outputToken = state.exchange.outputToken.value;
console.log('outputToken change deteced', outputToken) console.log('outputToken change deteced', outputToken)
let query = `{ let query = `{
Event(input:"${outputToken}"){ Event(input:"${outputToken}"){
ethValueOfToken ethValueOfToken
...@@ -60,7 +60,7 @@ class Visualization extends Component { ...@@ -60,7 +60,7 @@ class Visualization extends Component {
createLineGraph() { createLineGraph() {
// TODO: as you change whether you want to see days or years, change the extent // TODO: as you change whether you want to see days or years, change the extent
// scales are wicked important // scales are wicked important
let width = 1039; let width = 1039;
let height = 200; let height = 200;
let margin = {top: 20, bottom:20, left:20, right:20} let margin = {top: 20, bottom:20, left:20, right:20}
...@@ -68,47 +68,47 @@ class Visualization extends Component { ...@@ -68,47 +68,47 @@ class Visualization extends Component {
// first we want to see the min and max of our token prices // first we want to see the min and max of our token prices
let ethValueOfTokenExtent = d3.extent(this.state.data, element => element.ethValueOfToken); let ethValueOfTokenExtent = d3.extent(this.state.data, element => element.ethValueOfToken);
console.log('initial data visualized', this.state.data) console.log('initial data visualized', this.state.data)
// create a y scale, for the eth value of the token // create a y scale, for the eth value of the token
let yScale = d3.scaleLinear() let yScale = d3.scaleLinear()
.domain(ethValueOfTokenExtent) .domain(ethValueOfTokenExtent)
.range([margin.bottom, height - margin.top]); .range([margin.bottom, height - margin.top]);
// now that we have the scale, we create the actual axis // now that we have the scale, we create the actual axis
let yAxis = d3.axisLeft() let yAxis = d3.axisLeft()
.scale(yScale); .scale(yScale);
// time to put this y axis on the page // time to put this y axis on the page
svg.append('g') svg.append('g')
.attr('class', 'y axis') .attr('class', 'y axis')
.attr('transform', 'translate(50)') .attr('transform', 'translate(50)')
.call(yAxis); .call(yAxis);
// sanitize the data for the x-axis // sanitize the data for the x-axis
this.state.data.map(e => e.createdAt = new Date(e.createdAt)); this.state.data.map(e => e.createdAt = new Date(e.createdAt));
// similarly, check the min and max of our times // similarly, check the min and max of our times
let timeExtent = d3.extent(this.state.data, element => element.createdAt) let timeExtent = d3.extent(this.state.data, element => element.createdAt)
console.log('previous time extent', timeExtent) console.log('previous time extent', timeExtent)
// with this extent, create a scale for the x axis // with this extent, create a scale for the x axis
// BIG NOTE: for timeScales, you need to create new Date objects from the date string // BIG NOTE: for timeScales, you need to create new Date objects from the date string
// also, domain needs to take in an array // also, domain needs to take in an array
let xScale = d3.scaleTime() let xScale = d3.scaleTime()
.domain(timeExtent) .domain(timeExtent)
.range([margin.left, width - margin.right]); .range([margin.left, width - margin.right]);
// we have a scale, lets create the axis // we have a scale, lets create the axis
let xAxis = d3.axisBottom() let xAxis = d3.axisBottom()
.scale(xScale); .scale(xScale);
// append the axis to the DOM, make sure it's positioned correctly // append the axis to the DOM, make sure it's positioned correctly
svg.append('g') svg.append('g')
.attr('class', 'x axis') .attr('class', 'x axis')
.attr('transform', 'translate(30, 180)') .attr('transform', 'translate(30, 180)')
.call(xAxis); .call(xAxis);
let line = d3.line() let line = d3.line()
.x(element => xScale(element.createdAt)) .x(element => xScale(element.createdAt))
.y(element => yScale(element.ethValueOfToken)) .y(element => yScale(element.ethValueOfToken))
svg.append('path') svg.append('path')
.datum(this.state.data) .datum(this.state.data)
.attr('d', line) .attr('d', line)
.attr('class', 'line') .attr('class', 'line')
.attr("fill", "none") .attr("fill", "none")
.attr("stroke", "steelblue") .attr("stroke", "steelblue")
...@@ -116,7 +116,7 @@ class Visualization extends Component { ...@@ -116,7 +116,7 @@ class Visualization extends Component {
.attr("stroke-linecap", "round") .attr("stroke-linecap", "round")
.attr("stroke-width", 1.5) .attr("stroke-width", 1.5)
.attr('transform', 'translate(30)') .attr('transform', 'translate(30)')
} }
createNewLineGraph(){ createNewLineGraph(){
let width = 1039; let width = 1039;
...@@ -124,7 +124,7 @@ class Visualization extends Component { ...@@ -124,7 +124,7 @@ class Visualization extends Component {
let margin = {top: 20, bottom:20, left:20, right:20} let margin = {top: 20, bottom:20, left:20, right:20}
this.state.data.map(e => e.createdAt = new Date(e.createdAt)); this.state.data.map(e => e.createdAt = new Date(e.createdAt));
console.log('data is being set correctly', this.state.data) console.log('data is being set correctly', this.state.data)
// we set the range of the data again // we set the range of the data again
let yExtent = d3.extent(this.state.data, e => e.ethValueOfToken); let yExtent = d3.extent(this.state.data, e => e.ethValueOfToken);
let xExtent = d3.extent(this.state.data, e => e.createdAt); let xExtent = d3.extent(this.state.data, e => e.createdAt);
console.log('new yExtent', yExtent) console.log('new yExtent', yExtent)
...@@ -135,18 +135,18 @@ class Visualization extends Component { ...@@ -135,18 +135,18 @@ class Visualization extends Component {
.range([margin.bottom, height - margin.top]); .range([margin.bottom, height - margin.top]);
let xScale = d3.scaleTime() let xScale = d3.scaleTime()
.domain(xExtent) .domain(xExtent)
.range([margin.left, width - margin.right]); .range([margin.left, width - margin.right]);
// redefine the axes // redefine the axes
let xAxis = d3.axisBottom() let xAxis = d3.axisBottom()
.scale(xScale) .scale(xScale)
let yAxis = d3.axisLeft() let yAxis = d3.axisLeft()
.scale(yScale) .scale(yScale)
let svg = this.d3Graph.transition() let svg = this.d3Graph.transition()
let line = d3.line() let line = d3.line()
.x(element => xScale(element.createdAt)) .x(element => xScale(element.createdAt))
.y(element => yScale(element.ethValueOfToken)) .y(element => yScale(element.ethValueOfToken))
svg.select('.line') svg.select('.line')
.duration(750) .duration(750)
.attr('d', line(this.state.data)) .attr('d', line(this.state.data))
...@@ -159,12 +159,14 @@ class Visualization extends Component { ...@@ -159,12 +159,14 @@ class Visualization extends Component {
} }
render () { render () {
const width = 1039; const width = 1000;
const height = 200; const height = 200;
return ( return (
<svg width={width} height={height}> <div className="visualization" align="center">
<g ref="graph"/> <svg width={width} height={height}>
</svg> <g ref="graph"/>
</svg>
</div>
) )
} }
} }
...@@ -176,6 +178,6 @@ const mapStateToProps = state => ({ ...@@ -176,6 +178,6 @@ const mapStateToProps = state => ({
export default connect (mapStateToProps)(Visualization); export default connect (mapStateToProps)(Visualization);
// input and output tokens will have to be considered for this to work correctly // input and output tokens will have to be considered for this to work correctly
// we'll start by pulling the output token // we'll start by pulling the output token
// potential problem that these data points are not being written at the exact same time // potential problem that these data points are not being written at the exact same time
// we will deal with that when we get there // we will deal with that when we get there
\ No newline at end of file
...@@ -54,6 +54,7 @@ export const SET_INVEST_INVARIANT = 'SET_INVEST_INVARIANT'; ...@@ -54,6 +54,7 @@ export const SET_INVEST_INVARIANT = 'SET_INVEST_INVARIANT';
export const SET_INVEST_ETH_POOL = 'SET_INVEST_ETH'; export const SET_INVEST_ETH_POOL = 'SET_INVEST_ETH';
export const SET_INVEST_TOKEN_POOL = 'SET_INVEST_TOKENS'; export const SET_INVEST_TOKEN_POOL = 'SET_INVEST_TOKENS';
export const SET_INVEST_SHARES = 'SET_INVEST_SHARES'; export const SET_INVEST_SHARES = 'SET_INVEST_SHARES';
export const SET_USER_SHARES = 'SET_USER_SHARES';
export const SET_INVEST_TOKEN_BALANCE = 'SET_INVEST_TOKEN_BALANCE'; export const SET_INVEST_TOKEN_BALANCE = 'SET_INVEST_TOKEN_BALANCE';
export const SET_INVEST_ETH_BALANCE = 'SET_INVEST_ETH_BALANCE'; export const SET_INVEST_ETH_BALANCE = 'SET_INVEST_ETH_BALANCE';
export const SET_INVEST_SHARES_INPUT = 'SET_INVEST_SHARES_INPUT'; export const SET_INVEST_SHARES_INPUT = 'SET_INVEST_SHARES_INPUT';
......
...@@ -19,6 +19,7 @@ import { ...@@ -19,6 +19,7 @@ import {
SET_INVEST_ETH_POOL, SET_INVEST_ETH_POOL,
SET_INVEST_TOKEN_POOL, SET_INVEST_TOKEN_POOL,
SET_INVEST_SHARES, SET_INVEST_SHARES,
SET_USER_SHARES,
SET_INVEST_ETH_BALANCE, SET_INVEST_ETH_BALANCE,
SET_INVEST_TOKEN_BALANCE, SET_INVEST_TOKEN_BALANCE,
SET_INVEST_SHARES_INPUT, SET_INVEST_SHARES_INPUT,
...@@ -48,6 +49,7 @@ export default (state = {}, action) => { ...@@ -48,6 +49,7 @@ export default (state = {}, action) => {
investEthPool, investEthPool,
investTokenPool, investTokenPool,
investShares, investShares,
userShares,
investEthBalance, investEthBalance,
investTokenBalance, investTokenBalance,
investSharesInput, investSharesInput,
...@@ -96,6 +98,8 @@ export default (state = {}, action) => { ...@@ -96,6 +98,8 @@ export default (state = {}, action) => {
return Object.assign({}, state, { investTokenPool: investTokenPool }); return Object.assign({}, state, { investTokenPool: investTokenPool });
case SET_INVEST_SHARES: case SET_INVEST_SHARES:
return Object.assign({}, state, { investShares: investShares }); return Object.assign({}, state, { investShares: investShares });
case SET_USER_SHARES:
return Object.assign({}, state, { userShares: userShares });
case SET_INVEST_ETH_BALANCE: case SET_INVEST_ETH_BALANCE:
return Object.assign({}, state, { investEthBalance: investEthBalance }); return Object.assign({}, state, { investEthBalance: investEthBalance });
case SET_INVEST_TOKEN_BALANCE: case SET_INVEST_TOKEN_BALANCE:
......
...@@ -54,6 +54,7 @@ export default { ...@@ -54,6 +54,7 @@ export default {
investEthPool: 0, investEthPool: 0,
investTokenPool: 0, investTokenPool: 0,
investShares: 0, investShares: 0,
userShares: 0,
investTokenBalance: 0, investTokenBalance: 0,
investEthBalance: 0, investEthBalance: 0,
investSharesInput: 0, investSharesInput: 0,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment