From e86fbfa8e9ab4661c0afd411c72eaa9eb724027a Mon Sep 17 00:00:00 2001 From: tim Date: Wed, 26 Mar 2025 23:17:28 -0400 Subject: [PATCH] DCABuilder slippage parameter fix --- src/blockchain/orderlib.js | 5 +++++ src/blockchain/transaction.js | 29 ++++++++++++++++++++++++----- src/blockchain/wallet.js | 25 +++++++++++++++++++++++-- src/components/chart/DCABuilder.vue | 3 ++- src/fees.js | 5 +++-- src/layouts/chart/ChartLayout.vue | 3 ++- 6 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/blockchain/orderlib.js b/src/blockchain/orderlib.js index 3feb0cb..3aabe65 100644 --- a/src/blockchain/orderlib.js +++ b/src/blockchain/orderlib.js @@ -1,5 +1,6 @@ import {uint32max, uint64max} from "@/misc.js"; import {encodeIEE754} from "@/common.js"; +import {DEFAULT_SLIPPAGE} from "@/orderbuild.js"; export const MAX_FRACTION = 65535; export const NO_CONDITIONAL_ORDER = uint64max; @@ -86,6 +87,10 @@ export function newTranche({ if( marketOrder ) { if (minIntercept !== 0 || minSlope !== 0 || maxIntercept !== 0 || maxSlope !== 0) console.warn('Ignoring line information in a market order') + if (slippage === 0) { + console.warn(`setting market order slippage to ${DEFAULT_SLIPPAGE}`) + slippage = DEFAULT_SLIPPAGE + } minIntercept = encodeIEE754(slippage) // this is the slippage field for market orders minSlope = 0 maxIntercept = 0 diff --git a/src/blockchain/transaction.js b/src/blockchain/transaction.js index 03d5810..2bd4b64 100644 --- a/src/blockchain/transaction.js +++ b/src/blockchain/transaction.js @@ -1,4 +1,4 @@ -import {nav, uuid} from "@/misc.js"; +import {nav, sleep, uuid} from "@/misc.js"; import {vaultContract} from "@/blockchain/contract.js"; import {ensureVault, provider, switchChain, useWalletStore} from "@/blockchain/wallet.js"; import {toRaw} from "vue"; @@ -128,9 +128,15 @@ export class Transaction { this.failed('vault contract was null while sending order transaction') return null } - const tx = toRaw(await this.createTx(contract)) - this.signed(tx) - console.log(`sent transaction`, tx) + try { + const tx = toRaw(await this.createTx(contract)) + this.signed(tx) + console.log(`sent transaction`, tx) + } + catch (e) { + this.failed(e) + return null + } tx.wait().then(this.mined.bind(this)).catch(this.failed.bind(this)) return this.tx } @@ -159,7 +165,20 @@ export class PlaceOrderTransaction extends Transaction { async createTx(vaultContract) { - this.fee = await placementFee(this.vault, this.order) + const tries = 3; + let i; + for (i=0; i a + b)}) } diff --git a/src/blockchain/wallet.js b/src/blockchain/wallet.js index 352ecf7..67c6c94 100644 --- a/src/blockchain/wallet.js +++ b/src/blockchain/wallet.js @@ -75,8 +75,11 @@ function changeAccounts(chainId, accounts) { console.log('account logged in', addr) store.account = addr store.vaults = [] - discoverVaults(addr) - flushTransactions() + // one of these two methods will call flushTransactions() + if (useWalletStore().transaction!==null) + ensureVault() + else + discoverVaults(addr) socket.emit('address', chainId, addr) } } @@ -215,6 +218,7 @@ async function _discoverVaults(owner) { return // do not change what was already found todo is this correct? } } + console.log('new account === owner?', s.account, owner) if( s.account === owner ) { // double-check the account since it could have changed during our await s.vaults = result s.vaultVersions = versions @@ -291,6 +295,7 @@ export async function cancelAll(vault) { export function flushOrders(chainId, owner, num, vault) { const ws = useWalletStore(); + console.log('flushOrders', ws.transaction) if (ws.transaction!==null && ws.transaction.state < TransactionState.Proposed) ws.transaction.propose(owner, vault) let needsFlush = false @@ -376,6 +381,22 @@ export function flushTransactions() { async function asyncFlushTransactions() { const s = useStore() + const ws = useWalletStore() + console.log('flushTransactions', ws.transaction, s.vault) + if (ws.transaction !== null) { + if (s.vault === null) { + await ensureVault() + if (s.vault === null) { + console.error('vault could not be created') + const tx = ws.transaction + if (tx) { + tx.state = TransactionState.Error + ws.transaction = null + } + return + } + } + } if( provider === null ) { console.log('warning: asyncFlushOrders() cancelled due to null provider') return diff --git a/src/components/chart/DCABuilder.vue b/src/components/chart/DCABuilder.vue index 5b7fd21..cfaab30 100644 --- a/src/components/chart/DCABuilder.vue +++ b/src/components/chart/DCABuilder.vue @@ -102,7 +102,8 @@ function buildTranches() { const endTime = Math.ceil(props.builder.endTime + 10*props.builder.tranches) const startTime = Math.floor(props.builder.startTime); const tranches = [newTranche({marketOrder:true, - startTime, endTime, rateLimitFraction: rate, rateLimitPeriod: Math.floor(interval)})] + startTime, endTime, rateLimitFraction: rate, rateLimitPeriod: Math.floor(interval), + slippage: props.builder.slippage})] return {tranches, warnings} } diff --git a/src/fees.js b/src/fees.js index 4d337b7..d814d58 100644 --- a/src/fees.js +++ b/src/fees.js @@ -28,10 +28,11 @@ export async function getFeeSchedule(vaultAddr) { } -export async function placementFee(vaultAddr, order, window = 300) { +export async function placementFee(vaultContractOrAddr, order, window = 300) { // If the fees are about to change within `window` seconds of now, we send the higher native amount of the two fees. // If the fees sent are too much, the vault will refund the sender. - const vault = await vaultContract(vaultAddr, provider) + console.log('placementFee', vaultContractOrAddr, order) + const vault = typeof vaultContractOrAddr === 'string' ? await vaultContract(vaultContractOrAddr, provider) : vaultContractOrAddr const feeManager = await getFeeManagerContract(vault); const [sched, changeTimestamp] = await Promise.all([feeManager.fees(), feeManager.proposedFeeActivationTime()]) console.log('sched', order, sched) diff --git a/src/layouts/chart/ChartLayout.vue b/src/layouts/chart/ChartLayout.vue index 091599b..5629d0a 100644 --- a/src/layouts/chart/ChartLayout.vue +++ b/src/layouts/chart/ChartLayout.vue @@ -4,7 +4,8 @@ {{description}} - Confirm this {{noun}} in your wallet. + Confirm this {{noun}} in your wallet. + Creating your trading vault smart contract. Please wait a few seconds...