order validity checks
This commit is contained in:
@@ -45,7 +45,7 @@
|
|||||||
<v-card-actions><btn icon="mdi-safe-square" color="grey-darken-1" text="Create Vault" @click="ensureVault"/></v-card-actions>
|
<v-card-actions><btn icon="mdi-safe-square" color="grey-darken-1" text="Create Vault" @click="ensureVault"/></v-card-actions>
|
||||||
-->
|
-->
|
||||||
<v-card-text v-if="num===0">
|
<v-card-text v-if="num===0">
|
||||||
Please wait while your vault is being created. This should only take a few seconds.
|
Please wait while your vault is being created. This should only take a few seconds...
|
||||||
</v-card-text>
|
</v-card-text>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="s.vaults.length>num" :class="empty?'maxw':''">
|
<div v-if="s.vaults.length>num" :class="empty?'maxw':''">
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
import BuilderFactory from "@/components/chart/BuilderFactory.vue";
|
import BuilderFactory from "@/components/chart/BuilderFactory.vue";
|
||||||
import {builderFuncs, newBuilder, orderFuncs, useChartOrderStore} from "@/orderbuild.js";
|
import {builderFuncs, newBuilder, orderFuncs, useChartOrderStore} from "@/orderbuild.js";
|
||||||
import {useOrderStore} from "@/store/store.js";
|
import {useOrderStore} from "@/store/store.js";
|
||||||
import {computed, onMounted, onUnmounted, onUpdated, watch} from "vue";
|
import {computed, onMounted, onUnmounted, onUpdated, watch, watchEffect} from "vue";
|
||||||
import {lightenColor, lightenColor2} from "@/misc.js";
|
import {lightenColor, lightenColor2} from "@/misc.js";
|
||||||
import {useTheme} from "vuetify";
|
import {useTheme} from "vuetify";
|
||||||
import RowBar from "@/components/chart/RowBar.vue";
|
import RowBar from "@/components/chart/RowBar.vue";
|
||||||
@@ -66,9 +66,27 @@ function build(order, component, options={}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// check order validity
|
||||||
|
watchEffect(()=>{
|
||||||
|
let valid = props.order.amount
|
||||||
|
if (valid) {
|
||||||
|
for (const builder of builders.value) {
|
||||||
|
if (!builder.valid) {
|
||||||
|
valid = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
props.order.valid = valid
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
function buildOrder() {
|
function buildOrder() {
|
||||||
const order = props.order
|
const order = props.order
|
||||||
console.log('buildOrder', order)
|
console.log('buildOrder', order)
|
||||||
|
|
||||||
|
if (!order.amount) return null
|
||||||
|
|
||||||
// struct SwapOrder {
|
// struct SwapOrder {
|
||||||
// address tokenIn;
|
// address tokenIn;
|
||||||
// address tokenOut;
|
// address tokenOut;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<template v-slot:toolbar>
|
<template v-slot:toolbar>
|
||||||
<!-- <v-btn variant="flat" prepend-icon="mdi-plus" @click="co.newOrder" v-if="co.orders.length===0">New Order</v-btn>-->
|
<!-- <v-btn variant="flat" prepend-icon="mdi-plus" @click="co.newOrder" v-if="co.orders.length===0">New Order</v-btn>-->
|
||||||
<v-btn variant="text" prepend-icon="mdi-send" @click="placeOrder"
|
<v-btn variant="text" prepend-icon="mdi-send" @click="placeOrder"
|
||||||
:color="orderColor" v-if="co.orders.length>0" :disabled="co.drawing">
|
:color="orderColor" v-if="co.orders.length>0" :disabled="!valid">
|
||||||
Place Dexorder
|
Place Dexorder
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn variant="flat" prepend-icon="mdi-delete" v-if="co.orders.length>0" @click="cancelOrder">Reset</v-btn>
|
<v-btn variant="flat" prepend-icon="mdi-delete" v-if="co.orders.length>0" @click="cancelOrder">Reset</v-btn>
|
||||||
@@ -60,13 +60,21 @@ const showResetDialog = ref(false)
|
|||||||
const theme = useTheme().current
|
const theme = useTheme().current
|
||||||
const orderColor = computed(()=>co.orders.length===0?null : co.orders[0].buy ? theme.value.colors.success:theme.value.colors.error)
|
const orderColor = computed(()=>co.orders.length===0?null : co.orders[0].buy ? theme.value.colors.success:theme.value.colors.error)
|
||||||
|
|
||||||
|
const valid = computed(()=>{
|
||||||
|
if (co.drawing)
|
||||||
|
return false
|
||||||
|
for ( const order of co.orders )
|
||||||
|
if (!order.valid)
|
||||||
|
return false
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
function cancelOrder() {
|
function cancelOrder() {
|
||||||
showResetDialog.value = true
|
showResetDialog.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function placeOrder() {
|
async function placeOrder() {
|
||||||
const co = useChartOrderStore();
|
|
||||||
const chartOrders = co.orders;
|
const chartOrders = co.orders;
|
||||||
const built = []
|
const built = []
|
||||||
for (const chartOrder of chartOrders) {
|
for (const chartOrder of chartOrders) {
|
||||||
@@ -75,7 +83,6 @@ async function placeOrder() {
|
|||||||
const order = buildOrder()
|
const order = buildOrder()
|
||||||
built.push(order)
|
built.push(order)
|
||||||
}
|
}
|
||||||
co.built = built
|
|
||||||
console.log('place orders', built)
|
console.log('place orders', built)
|
||||||
if (built.length !== 1) {
|
if (built.length !== 1) {
|
||||||
console.error('Multiple orders not supported')
|
console.error('Multiple orders not supported')
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<div v-if="rungs>1" class="mx-2 d-flex align-center">
|
<div v-if="rungs>1" class="mx-2 d-flex align-center">
|
||||||
<v-slider v-if="rungs>1" direction="vertical" min="-100" max="100" v-model="skew100" class="no-slider-bg ml-2 mr-4" hide-details/>
|
<v-slider v-if="rungs>1" direction="vertical" min="-100" max="100" v-model="skew100" class="no-slider-bg ml-2 mr-4" hide-details/>
|
||||||
<v-text-field type="number" v-model="skew100" min="-100" max="100"
|
<v-text-field type="number" v-model="skew100" min="-100" max="100"
|
||||||
density="compact" hide-details variant="outlined" label="Skew" step="10"
|
density="compact" hide-details variant="outlined" label="Skew" step="5"
|
||||||
:color="color" :base-color="color">
|
:color="color" :base-color="color">
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<v-btn icon="mdi-scale-balance" variant="plain" @click="builder.skew=0; adjustShapes()" :color="color"/>
|
<v-btn icon="mdi-scale-balance" variant="plain" @click="builder.skew=0; adjustShapes()" :color="color"/>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {computed, onBeforeUnmount, onMounted, onUnmounted, onUpdated, watch} from "vue";
|
import {computed, onBeforeUnmount, onMounted, onUnmounted, onUpdated, watch, watchEffect} from "vue";
|
||||||
import {chart} from "@/charts/chart.js";
|
import {chart} from "@/charts/chart.js";
|
||||||
import {applyLine2, builderFuncs, useChartOrderStore} from "@/orderbuild.js";
|
import {applyLine2, builderFuncs, useChartOrderStore} from "@/orderbuild.js";
|
||||||
import Color from "color";
|
import Color from "color";
|
||||||
@@ -88,6 +88,7 @@ const defaultColor = computeDefaultColor()
|
|||||||
|
|
||||||
// Fields must be defined in order to be reactive
|
// Fields must be defined in order to be reactive
|
||||||
builderDefaults(props, emit, {
|
builderDefaults(props, emit, {
|
||||||
|
valid: false,
|
||||||
allocation: 1.0,
|
allocation: 1.0,
|
||||||
start: null, // todo
|
start: null, // todo
|
||||||
end: null, // todo
|
end: null, // todo
|
||||||
@@ -99,11 +100,22 @@ builderDefaults(props, emit, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
function buildTranches() {
|
// validity checks
|
||||||
const builder = props.builder
|
watchEffect(()=>{
|
||||||
const order = props.order
|
const order = props.order
|
||||||
|
const builder = props.builder
|
||||||
|
props.builder.valid =
|
||||||
|
order && builder &&
|
||||||
|
builder.rungs >= 1 && builder.priceA &&
|
||||||
|
(builder.rungs < 2 || builder.priceB)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
function buildTranches() {
|
||||||
|
const order = props.order
|
||||||
|
const builder = props.builder
|
||||||
const tranches = []
|
const tranches = []
|
||||||
if (!builder || !order) return
|
|
||||||
console.log('buildTranches', builder, order, tranches)
|
console.log('buildTranches', builder, order, tranches)
|
||||||
const ps = prices.value
|
const ps = prices.value
|
||||||
const ws = weights.value
|
const ws = weights.value
|
||||||
@@ -122,7 +134,7 @@ function buildTranches() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// todo move this into a supercomponent
|
// todo move this code and the validity check into a supercomponent
|
||||||
let lastId = props.builder.id
|
let lastId = props.builder.id
|
||||||
builderFuncs[props.builder.id] = buildTranches
|
builderFuncs[props.builder.id] = buildTranches
|
||||||
onUpdated(()=>{
|
onUpdated(()=>{
|
||||||
@@ -228,7 +240,7 @@ function computeRange() {
|
|||||||
let range = 0
|
let range = 0
|
||||||
const series = chart.getSeries()
|
const series = chart.getSeries()
|
||||||
const bars = series.data().bars();
|
const bars = series.data().bars();
|
||||||
const final = Math.max(bars.size() - 10, 0)
|
const final = Math.max(bars.size() - 50, 0)
|
||||||
let count = 0
|
let count = 0
|
||||||
for (let barIndex = bars.size() - 1; barIndex >= final; barIndex--) {
|
for (let barIndex = bars.size() - 1; barIndex >= final; barIndex--) {
|
||||||
count++
|
count++
|
||||||
@@ -247,11 +259,15 @@ const rungs = computed({
|
|||||||
return props.builder.rungs
|
return props.builder.rungs
|
||||||
},
|
},
|
||||||
set(r) {
|
set(r) {
|
||||||
|
if (!r) {
|
||||||
|
props.builder.rungs = 1
|
||||||
|
return
|
||||||
|
}
|
||||||
r = Number(r)
|
r = Number(r)
|
||||||
props.builder.rungs = r
|
props.builder.rungs = r
|
||||||
if ( r > 0 && props.builder.priceB === null ) {
|
if ( r > 0 && props.builder.priceB === null ) {
|
||||||
// convert single line to a range
|
// convert single line to a range
|
||||||
const range = computeRange()
|
const range = 2 * computeRange()
|
||||||
const mid = props.builder.priceA
|
const mid = props.builder.priceA
|
||||||
props.builder.priceA = mid - range/2
|
props.builder.priceA = mid - range/2
|
||||||
props.builder.priceB = mid + range/2
|
props.builder.priceB = mid + range/2
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const props = defineProps(['order', 'builder'])
|
|||||||
const emit = defineEmits(['update:builder'])
|
const emit = defineEmits(['update:builder'])
|
||||||
|
|
||||||
// Fields must be defined in order to be reactive
|
// Fields must be defined in order to be reactive
|
||||||
builderDefaults(props, emit, {slippage: 0.10,})
|
builderDefaults(props, emit, {valid: true, slippage: 0.10,})
|
||||||
const slippage = computed({
|
const slippage = computed({
|
||||||
get() {console.log('slip',props.builder,props.builder.slippage); return props.builder.slippage},
|
get() {console.log('slip',props.builder,props.builder.slippage); return props.builder.slippage},
|
||||||
set(v) {props.builder.slippage=v; emit('update:builder', props.builder)}
|
set(v) {props.builder.slippage=v; emit('update:builder', props.builder)}
|
||||||
|
|||||||
@@ -29,17 +29,18 @@ const Order = {
|
|||||||
export const orderFuncs = {}
|
export const orderFuncs = {}
|
||||||
|
|
||||||
// the key is order.builder.id and the value is a function() that returns an array of tranches
|
// the key is order.builder.id and the value is a function() that returns an array of tranches
|
||||||
|
// if null is returned, the builder inputs are not valid and the place order button will be disabled
|
||||||
export const builderFuncs = {}
|
export const builderFuncs = {}
|
||||||
|
|
||||||
function newDefaultOrder() {
|
function newDefaultOrder() {
|
||||||
return { id:uuid(), amount:1, amountIsTokenA: true, buy: true, builders:[] }
|
return { id:uuid(), valid: false, amount:null, amountIsTokenA: true, buy: true, builders:[] }
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useChartOrderStore = defineStore('chart_orders', () => {
|
export const useChartOrderStore = defineStore('chart_orders', () => {
|
||||||
const chartReady = ref(false)
|
const chartReady = ref(false)
|
||||||
|
|
||||||
const orders = ref([newDefaultOrder()]) // order models in UI format
|
const defaultOrder = newDefaultOrder()
|
||||||
const built = ref([{}]) // orders in blockchain format, ready to send
|
const orders = ref([defaultOrder]) // order models in UI format
|
||||||
const selectedOrder = ref(null)
|
const selectedOrder = ref(null)
|
||||||
const selectedSymbol = ref(null)
|
const selectedSymbol = ref(null)
|
||||||
const selectedPool = ref(null)
|
const selectedPool = ref(null)
|
||||||
|
|||||||
Reference in New Issue
Block a user