This commit is contained in:
Tim
2024-04-03 15:04:29 -04:00
parent 391c5738ed
commit e406960c70
10 changed files with 108 additions and 35 deletions

View File

@@ -278,16 +278,17 @@ export const PendingOrderState = {
export async function pendOrder(order) { export async function pendOrder(order) {
console.log('order', JSON.stringify(order))
const s = useStore() const s = useStore()
useWalletStore().pendingOrders.splice(0,0,{ const pend = {
id: uuid(), id: uuid(),
chainId: s.chainId, chainId: s.chainId,
placementTime: Date.now()/1000, placementTime: Date.now()/1000,
vault: s.vaults.length ? s.vaults[0] : null, vault: s.vaults.length ? s.vaults[0] : null,
state: PendingOrderState.Submitted, state: PendingOrderState.Submitted,
order order
}) };
useWalletStore().pendingOrders.splice(0,0, pend)
console.log('pending order', pend.id, JSON.stringify(order))
ensureVault() ensureVault()
} }
@@ -322,7 +323,7 @@ export function flushOrders(vault) {
if (pend.vault === null) if (pend.vault === null)
pend.vault = vault pend.vault = vault
if (pend.state === PendingOrderState.Submitted) { if (pend.state === PendingOrderState.Submitted) {
console.log('pending', pend) console.log('flushing order', pend.id)
pendOrderAsTransaction(pend) pendOrderAsTransaction(pend)
pend.state = PendingOrderState.Signing pend.state = PendingOrderState.Signing
needsFlush = true needsFlush = true
@@ -345,25 +346,29 @@ function pendOrderAsTransaction(pend) {
pend.state = PendingOrderState.Rejected pend.state = PendingOrderState.Rejected
return null return null
} }
console.log('placing order', pend) console.log('placing order', pend.id)
const tx = await contract.placeDexorder(pend.order) // todo update status const tx = await contract.placeDexorder(pend.order) // todo update status
pend.tx = tx pend.tx = tx
pend.state = PendingOrderState.Sent
console.log(`order ${pend.id} sent transaction`, tx)
tx.wait().then((txReceipt)=>{ tx.wait().then((txReceipt)=>{
console.log('mined order', pend.id, txReceipt)
pend.receipt = txReceipt
const ws = useWalletStore(); const ws = useWalletStore();
ws.pendingOrders = ws.pendingOrders.filter((o)=>o!==pend) ws.pendingOrders = ws.pendingOrders.filter((p)=>p!==pend) // remove pend since order was mined
}) })
return tx return tx
}, },
(e) => { (e) => {
if( e.info?.error?.code === 4001 ) { if( e.info?.error?.code === 4001 ) {
console.log(`user rejected transaction`) console.log(`wallet refused order`, pend.id)
pend.state = PendingOrderState.Rejected pend.state = PendingOrderState.Rejected
return true // returning true means we handled the error. any other return value will dump to console. return true // returning true means we handled the error. any other return value will dump to console.
} }
}) })
} }
0
export function pendTransaction(sender, errHandler) { export function pendTransaction(sender, errHandler) {
const s = useStore() const s = useStore()
s.transactionSenders.push([sender,errHandler]) s.transactionSenders.push([sender,errHandler])
@@ -409,7 +414,9 @@ function doSendTransaction(sender, signer, errHandler) {
sender(signer).then((tx)=>{ sender(signer).then((tx)=>{
if (tx!==null) { if (tx!==null) {
console.log('sent transaction', tx) console.log('sent transaction', tx)
tx.wait().then((tr)=>console.log('tx receipt',tr)) tx.wait().then((tr)=>{
console.log('tx receipt',tr)
})
} }
}).catch(async (e)=>{ }).catch(async (e)=>{
let dumpErr = true let dumpErr = true

View File

@@ -1,5 +1,5 @@
<template> <template>
<v-tooltip :model-value="!error&&copied" :open-on-hover="false"> <v-tooltip :model-value="!error&&copied" :open-on-hover="false" location="top">
<template v-slot:activator="{ props }"> <template v-slot:activator="{ props }">
<span v-bind="props" style="cursor: pointer" @click="copy()"> <span v-bind="props" style="cursor: pointer" @click="copy()">
<v-btn v-bind="props" v-if="permitted" rounded variant="text" size="small" density="compact" @click="copy()" <v-btn v-bind="props" v-if="permitted" rounded variant="text" size="small" density="compact" @click="copy()"

View File

@@ -21,6 +21,7 @@ const s = useStore()
const prefs = usePrefStore() const prefs = usePrefStore()
async function token(obj) { async function token(obj) {
if (!obj) return null
return obj.a ? obj : await getToken(s.chainId, obj) return obj.a ? obj : await getToken(s.chainId, obj)
} }

55
src/components/Pulse.vue Normal file
View File

@@ -0,0 +1,55 @@
<template>
<span ref="element">
<slot/>
</span>
</template>
<script setup>
import {ref, watchEffect} from "vue";
const props = defineProps(['touch', 'color'])
const element = ref(null)
let lastValue = props.touch
function pulse() {
if (props.touch === lastValue) return
console.log(`value changed from ${lastValue} to ${props.touch}`)
lastValue = props.touch
const e = element.value;
console.log('element', e)
if (!e.classList.contains('pulse')) {
// add class for the first time
console.log('first pulse')
e.classList.add('pulse')
}
else {
// restart
console.log('reset pulse')
e.getAnimations().forEach((a) => {
console.log('animation', a)
a.cancel();
a.play();
})
}
}
watchEffect(pulse)
</script>
<style scoped lang="scss">
.pulse {
animation: forwards;
animation-duration: 1s;
animation-name: pulse;
}
@keyframes pulse {
0% {
background-color: gray;
}
100% {
background-color: white;
}
}
</style>

View File

@@ -4,27 +4,31 @@
item-selectable="selectable" :show-select="false" :show-expand="true"> item-selectable="selectable" :show-select="false" :show-expand="true">
<template v-slot:item.start="{ value }">{{ dateString(value) }}</template> <template v-slot:item.start="{ value }">{{ dateString(value) }}</template>
<template v-slot:item.input="{ item }"> <template v-slot:item.input="{ item }">
<suspense v-if="item.order.amountIsInput"> <suspense>
<span> <span v-if="item.order.amountIsInput">
<pulse :touch="item.filledIn">
<token-amount :addr="item.order.tokenIn" :amount="item.filledIn" :raw="true"/> <token-amount :addr="item.order.tokenIn" :amount="item.filledIn" :raw="true"/>
</pulse>
/ /
<token-amount :addr="item.order.tokenIn" :amount="item.order.amount"/> <token-amount :addr="item.order.tokenIn" :amount="item.order.amount"/>
</span> </span>
</suspense> </suspense>
<suspense v-if="!item.order.amountIsInput"> <suspense>
<token-symbol :addr="item.order.tokenIn"/> <token-symbol :addr="item.order.tokenIn" v-if="!item.order.amountIsInput"/>
</suspense> </suspense>
</template> </template>
<template v-slot:item.output="{ item }"> <template v-slot:item.output="{ item }">
<suspense v-if="!item.order.amountIsInput"> <suspense>
<span> <span v-if="!item.order.amountIsInput">
<pulse :touch="item.filledOut">
<token-amount :addr="item.order.tokenOut" :amount="item.filledOut" :raw="true"/> <token-amount :addr="item.order.tokenOut" :amount="item.filledOut" :raw="true"/>
</pulse>
/ /
<token-amount :addr="item.order.tokenOut" :amount="item.order.amount"/> <token-amount :addr="item.order.tokenOut" :amount="item.order.amount"/>
</span> </span>
</suspense> </suspense>
<suspense v-if="item.order.amountIsInput"> <suspense>
<token-symbol :addr="item.order.tokenOut"/> <token-symbol :addr="item.order.tokenOut" v-if="item.order.amountIsInput"/>
</suspense> </suspense>
</template> </template>
<!-- <!--
@@ -87,9 +91,11 @@
<tr v-for="(t, i) in item.order.tranches"> <tr v-for="(t, i) in item.order.tranches">
<td class="text-right">Tranche {{ i + 1 }}</td> <td class="text-right">Tranche {{ i + 1 }}</td>
<td class="text-center w-33"> <td class="text-center w-33">
<suspense v-if="item.state > OrderState.Signing"> <suspense>
<span> <span v-if="item.state > OrderState.Signing">
<pulse :touch="item.trancheFilled[i]">
<token-amount :addr="item.amountToken" :amount="item.trancheFilled[i]" :raw="true"/> <token-amount :addr="item.amountToken" :amount="item.trancheFilled[i]" :raw="true"/>
</pulse>
/ /
</span> </span>
</suspense> </suspense>
@@ -136,6 +142,7 @@ import Btn from "@/components/Btn.vue"
import {cancelAll, cancelOrder, PendingOrderState, useWalletStore} from "@/blockchain/wallet.js"; import {cancelAll, cancelOrder, PendingOrderState, useWalletStore} from "@/blockchain/wallet.js";
import {dateString, pairPriceAddr} from "@/misc.js"; import {dateString, pairPriceAddr} from "@/misc.js";
import {isOpen, OrderState} from "@/blockchain/orderlib.js"; import {isOpen, OrderState} from "@/blockchain/orderlib.js";
import Pulse from "@/components/Pulse.vue";
const s = useStore() const s = useStore()
const ws = useWalletStore() const ws = useWalletStore()

View File

@@ -12,7 +12,7 @@
import ToolbarPane from "@/components/chart/ToolbarPane.vue"; import ToolbarPane from "@/components/chart/ToolbarPane.vue";
import NeedsProvider from "@/components/NeedsProvider.vue"; import NeedsProvider from "@/components/NeedsProvider.vue";
import Orders from "@/components/Orders.vue"; import Orders from "@/components/Status.vue";
import NeedsSigner from "@/components/NeedsSigner.vue"; import NeedsSigner from "@/components/NeedsSigner.vue";
</script> </script>

View File

@@ -285,24 +285,25 @@ const prices = computed(()=>{
const weights = computed(() => { const weights = computed(() => {
const r = props.builder.rungs const n = props.builder.rungs
const s = -props.builder.skew const s = -props.builder.skew
if (r === 1) return [1] if (n === 1) return [1]
const result = [] const result = []
if (s === 0) { if (s === 0) {
for (let i = 0; i < r; i++) // equal weighted
result.push(1 / r) for (let i = 0; i < n; i++)
result.push(1 / n)
} else if (s === 1) { } else if (s === 1) {
result.push(1) result.push(1)
for (let i = 1; i < r; i++) for (let i = 1; i < n; i++)
result.push(0) result.push(0)
} else if (s === -1) { } else if (s === -1) {
for (let i = 1; i < r; i++) for (let i = 1; i < n; i++)
result.push(0) result.push(0)
result.push(1) result.push(1)
} else { } else {
for (let i = 0; i < r; i++) for (let i = 0; i < n; i++)
result.push((1 - s * (2 * i / (r - 1) - 1)) / r) result.push((1 - s * (2 * i / (n - 1) - 1)) / n)
} }
return result return result
}) })

View File

@@ -12,7 +12,8 @@ import {computed} from "vue";
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
const props = defineProps(['icon', 'path', 'tooltip']) const props = defineProps(['icon', 'path', 'tooltip'])
const isCurrent = computed(() => useRoute().path === props.path) const route = useRoute();
const isCurrent = computed(() => route.path === props.path)
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -11,7 +11,8 @@ const routes = [
// route level code-splitting // route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route // this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited. // which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "chartorder" */ '@/components/chart/ChartPlaceOrder.vue'), // component: () => import(/* webpackChunkName: "chartorder" */ '@/components/chart/ChartPlaceOrder.vue'),
component: () => import(/* webpackChunkName: "vaultview" */ '@/components/chart/ChartVault.vue'),
}, },
{ {
path: '/order', path: '/order',

View File

@@ -12,7 +12,7 @@
</template> </template>
<script setup> <script setup>
import Orders from "@/components/Orders.vue"; import Orders from "@/components/Status.vue";
import NeedsSigner from "@/components/NeedsSigner.vue"; import NeedsSigner from "@/components/NeedsSigner.vue";
import NeedsProvider from "@/components/NeedsProvider.vue"; import NeedsProvider from "@/components/NeedsProvider.vue";
import PhoneCard from "@/components/PhoneCard.vue"; import PhoneCard from "@/components/PhoneCard.vue";