hive-stream 3.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +35 -0
- package/DOCUMENTATION.md +396 -0
- package/README.md +160 -39
- package/dist/actions.d.ts +3 -3
- package/dist/actions.js +7 -7
- package/dist/actions.js.map +1 -1
- package/dist/adapters/base.adapter.d.ts +19 -1
- package/dist/adapters/base.adapter.js +16 -0
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +5 -11
- package/dist/adapters/mongodb.adapter.js +10 -10
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +17 -0
- package/dist/adapters/postgresql.adapter.js +99 -8
- package/dist/adapters/postgresql.adapter.js.map +1 -1
- package/dist/adapters/sqlite.adapter.d.ts +17 -0
- package/dist/adapters/sqlite.adapter.js +99 -8
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.js +86 -0
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +26 -0
- package/dist/config.js +76 -4
- package/dist/config.js.map +1 -1
- package/dist/contracts/coinflip.contract.d.ts +8 -26
- package/dist/contracts/coinflip.contract.js +123 -144
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/contract.d.ts +3 -0
- package/dist/contracts/contract.js +26 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/dice.contract.d.ts +9 -36
- package/dist/contracts/dice.contract.js +135 -200
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/exchange.contract.d.ts +11 -0
- package/dist/contracts/exchange.contract.js +492 -0
- package/dist/contracts/exchange.contract.js.map +1 -0
- package/dist/contracts/lotto.contract.d.ts +15 -19
- package/dist/contracts/lotto.contract.js +154 -162
- package/dist/contracts/lotto.contract.js.map +1 -1
- package/dist/contracts/nft.contract.d.ts +4 -0
- package/dist/contracts/nft.contract.js +65 -0
- package/dist/contracts/nft.contract.js.map +1 -1
- package/dist/contracts/poll.contract.d.ts +4 -0
- package/dist/contracts/poll.contract.js +105 -0
- package/dist/contracts/poll.contract.js.map +1 -0
- package/dist/contracts/rps.contract.d.ts +9 -0
- package/dist/contracts/rps.contract.js +217 -0
- package/dist/contracts/rps.contract.js.map +1 -0
- package/dist/contracts/tipjar.contract.d.ts +4 -0
- package/dist/contracts/tipjar.contract.js +60 -0
- package/dist/contracts/tipjar.contract.js.map +1 -0
- package/dist/contracts/token.contract.d.ts +3 -17
- package/dist/contracts/token.contract.js +128 -80
- package/dist/contracts/token.contract.js.map +1 -1
- package/dist/exchanges/coingecko.d.ts +7 -1
- package/dist/exchanges/coingecko.js +38 -21
- package/dist/exchanges/coingecko.js.map +1 -1
- package/dist/exchanges/exchange.d.ts +15 -8
- package/dist/exchanges/exchange.js +65 -11
- package/dist/exchanges/exchange.js.map +1 -1
- package/dist/hive-rates.d.ts +29 -4
- package/dist/hive-rates.js +179 -92
- package/dist/hive-rates.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +63 -0
- package/dist/metadata.js +407 -0
- package/dist/metadata.js.map +1 -0
- package/dist/streamer.d.ts +104 -11
- package/dist/streamer.js +415 -143
- package/dist/streamer.js.map +1 -1
- package/dist/test.js +11 -12
- package/dist/test.js.map +1 -1
- package/dist/types/hive-stream.d.ts +85 -14
- package/dist/types/rates.d.ts +47 -0
- package/dist/types/rates.js +29 -0
- package/dist/types/rates.js.map +1 -0
- package/dist/utils.d.ts +318 -11
- package/dist/utils.js +804 -115
- package/dist/utils.js.map +1 -1
- package/examples/contracts/README.md +8 -0
- package/examples/contracts/exchange.ts +38 -0
- package/examples/contracts/poll.ts +21 -0
- package/examples/contracts/rps.ts +19 -0
- package/examples/contracts/tipjar.ts +19 -0
- package/package.json +20 -19
- package/test-contract-block.md +3 -3
- package/tests/actions.spec.ts +7 -7
- package/tests/adapters/actions-persistence.spec.ts +4 -4
- package/tests/adapters/sqlite.adapter.spec.ts +2 -2
- package/tests/config-input.spec.ts +90 -0
- package/tests/contracts/coinflip.contract.spec.ts +26 -154
- package/tests/contracts/dice.contract.spec.ts +24 -140
- package/tests/contracts/exchange.contract.spec.ts +84 -0
- package/tests/contracts/lotto.contract.spec.ts +30 -295
- package/tests/contracts/token.contract.spec.ts +72 -316
- package/tests/exchanges/coingecko.exchange.spec.ts +169 -0
- package/tests/exchanges/exchange.base.spec.ts +246 -0
- package/tests/helpers/mock-fetch.ts +165 -0
- package/tests/hive-chain-features.spec.ts +319 -0
- package/tests/hive-rates.spec.ts +443 -0
- package/tests/integration/hive-rates.integration.spec.ts +35 -0
- package/tests/metadata.spec.ts +63 -0
- package/tests/streamer-actions.spec.ts +29 -18
- package/tests/streamer.spec.ts +142 -49
- package/tests/types/rates.spec.ts +216 -0
- package/tests/utils.spec.ts +27 -6
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createExchangeContract = createExchangeContract;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const contract_1 = require("./contract");
|
|
11
|
+
const DEFAULT_NAME = 'exchange';
|
|
12
|
+
const DEFAULT_ACCOUNT = 'beggars';
|
|
13
|
+
const SIDE_VALUES = ['buy', 'sell'];
|
|
14
|
+
function createExchangeContract(options = {}) {
|
|
15
|
+
const name = options.name || DEFAULT_NAME;
|
|
16
|
+
const account = options.account || DEFAULT_ACCOUNT;
|
|
17
|
+
const feeAccount = options.feeAccount || account;
|
|
18
|
+
const makerFeeBps = options.makerFeeBps ?? 10;
|
|
19
|
+
const takerFeeBps = options.takerFeeBps ?? 20;
|
|
20
|
+
const basePrecision = options.basePrecision ?? 8;
|
|
21
|
+
const quotePrecision = options.quotePrecision ?? 8;
|
|
22
|
+
const defaultAssetPrecision = options.defaultAssetPrecision ?? Math.max(basePrecision, quotePrecision);
|
|
23
|
+
const state = {
|
|
24
|
+
adapter: null,
|
|
25
|
+
streamer: null
|
|
26
|
+
};
|
|
27
|
+
const createPairSchema = zod_1.z.object({
|
|
28
|
+
base: zod_1.z.string().min(1).max(20),
|
|
29
|
+
quote: zod_1.z.string().min(1).max(20)
|
|
30
|
+
});
|
|
31
|
+
const depositSchema = zod_1.z.object({}).passthrough();
|
|
32
|
+
const withdrawSchema = zod_1.z.object({
|
|
33
|
+
asset: zod_1.z.string().min(1).max(20),
|
|
34
|
+
amount: zod_1.z.string().min(1),
|
|
35
|
+
to: zod_1.z.string().min(1).max(16).optional()
|
|
36
|
+
});
|
|
37
|
+
const placeOrderSchema = zod_1.z.object({
|
|
38
|
+
side: zod_1.z.enum(SIDE_VALUES),
|
|
39
|
+
base: zod_1.z.string().min(1).max(20),
|
|
40
|
+
quote: zod_1.z.string().min(1).max(20),
|
|
41
|
+
price: zod_1.z.string().min(1),
|
|
42
|
+
amount: zod_1.z.string().min(1)
|
|
43
|
+
});
|
|
44
|
+
const cancelOrderSchema = zod_1.z.object({
|
|
45
|
+
orderId: zod_1.z.string().min(1)
|
|
46
|
+
});
|
|
47
|
+
const matchOrdersSchema = zod_1.z.object({
|
|
48
|
+
base: zod_1.z.string().min(1).max(20).optional(),
|
|
49
|
+
quote: zod_1.z.string().min(1).max(20).optional(),
|
|
50
|
+
limit: zod_1.z.number().int().min(1).max(100).optional(),
|
|
51
|
+
snapshot: zod_1.z.boolean().optional(),
|
|
52
|
+
depth: zod_1.z.number().int().min(1).max(200).optional()
|
|
53
|
+
}).optional();
|
|
54
|
+
const snapshotSchema = zod_1.z.object({
|
|
55
|
+
base: zod_1.z.string().min(1).max(20),
|
|
56
|
+
quote: zod_1.z.string().min(1).max(20),
|
|
57
|
+
depth: zod_1.z.number().int().min(1).max(200).optional()
|
|
58
|
+
});
|
|
59
|
+
const transferSchema = zod_1.z.object({
|
|
60
|
+
to: zod_1.z.string().min(1).max(16),
|
|
61
|
+
asset: zod_1.z.string().min(1).max(20),
|
|
62
|
+
amount: zod_1.z.string().min(1)
|
|
63
|
+
});
|
|
64
|
+
const formatAmount = (value, precision) => {
|
|
65
|
+
return value.decimalPlaces(precision, bignumber_js_1.default.ROUND_DOWN).toFixed(precision);
|
|
66
|
+
};
|
|
67
|
+
const getAssetPrecision = (asset) => {
|
|
68
|
+
if (asset === 'HIVE' || asset === 'HBD') {
|
|
69
|
+
return 3;
|
|
70
|
+
}
|
|
71
|
+
return defaultAssetPrecision;
|
|
72
|
+
};
|
|
73
|
+
const calculateFee = (amount, bps) => {
|
|
74
|
+
if (bps <= 0) {
|
|
75
|
+
return new bignumber_js_1.default(0);
|
|
76
|
+
}
|
|
77
|
+
return amount.multipliedBy(bps).dividedBy(10000);
|
|
78
|
+
};
|
|
79
|
+
const initializeTables = async () => {
|
|
80
|
+
await state.adapter.query(`
|
|
81
|
+
CREATE TABLE IF NOT EXISTS exchange_balances (
|
|
82
|
+
account TEXT NOT NULL,
|
|
83
|
+
asset TEXT NOT NULL,
|
|
84
|
+
available TEXT NOT NULL DEFAULT '0',
|
|
85
|
+
locked TEXT NOT NULL DEFAULT '0',
|
|
86
|
+
PRIMARY KEY (account, asset)
|
|
87
|
+
)
|
|
88
|
+
`);
|
|
89
|
+
await state.adapter.query(`
|
|
90
|
+
CREATE TABLE IF NOT EXISTS exchange_pairs (
|
|
91
|
+
base_asset TEXT NOT NULL,
|
|
92
|
+
quote_asset TEXT NOT NULL,
|
|
93
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
94
|
+
PRIMARY KEY (base_asset, quote_asset)
|
|
95
|
+
)
|
|
96
|
+
`);
|
|
97
|
+
await state.adapter.query(`
|
|
98
|
+
CREATE TABLE IF NOT EXISTS exchange_orders (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
account TEXT NOT NULL,
|
|
101
|
+
side TEXT NOT NULL,
|
|
102
|
+
base_asset TEXT NOT NULL,
|
|
103
|
+
quote_asset TEXT NOT NULL,
|
|
104
|
+
price TEXT NOT NULL,
|
|
105
|
+
amount TEXT NOT NULL,
|
|
106
|
+
remaining TEXT NOT NULL,
|
|
107
|
+
status TEXT NOT NULL,
|
|
108
|
+
created_at DATETIME NOT NULL
|
|
109
|
+
)
|
|
110
|
+
`);
|
|
111
|
+
await state.adapter.query(`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS exchange_trades (
|
|
113
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
114
|
+
buy_order_id TEXT NOT NULL,
|
|
115
|
+
sell_order_id TEXT NOT NULL,
|
|
116
|
+
price TEXT NOT NULL,
|
|
117
|
+
amount TEXT NOT NULL,
|
|
118
|
+
base_asset TEXT NOT NULL,
|
|
119
|
+
quote_asset TEXT NOT NULL,
|
|
120
|
+
buyer TEXT NOT NULL,
|
|
121
|
+
seller TEXT NOT NULL,
|
|
122
|
+
created_at DATETIME NOT NULL
|
|
123
|
+
)
|
|
124
|
+
`);
|
|
125
|
+
await state.adapter.query(`
|
|
126
|
+
CREATE TABLE IF NOT EXISTS exchange_deposits (
|
|
127
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
128
|
+
account TEXT NOT NULL,
|
|
129
|
+
asset TEXT NOT NULL,
|
|
130
|
+
amount TEXT NOT NULL,
|
|
131
|
+
block_number INTEGER NOT NULL,
|
|
132
|
+
transaction_id TEXT NOT NULL,
|
|
133
|
+
created_at DATETIME NOT NULL
|
|
134
|
+
)
|
|
135
|
+
`);
|
|
136
|
+
await state.adapter.query(`
|
|
137
|
+
CREATE TABLE IF NOT EXISTS exchange_withdrawals (
|
|
138
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
139
|
+
account TEXT NOT NULL,
|
|
140
|
+
asset TEXT NOT NULL,
|
|
141
|
+
amount TEXT NOT NULL,
|
|
142
|
+
status TEXT NOT NULL,
|
|
143
|
+
block_number INTEGER NOT NULL,
|
|
144
|
+
transaction_id TEXT NOT NULL,
|
|
145
|
+
created_at DATETIME NOT NULL
|
|
146
|
+
)
|
|
147
|
+
`);
|
|
148
|
+
await state.adapter.query(`
|
|
149
|
+
CREATE TABLE IF NOT EXISTS exchange_orderbook_snapshots (
|
|
150
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
151
|
+
base_asset TEXT NOT NULL,
|
|
152
|
+
quote_asset TEXT NOT NULL,
|
|
153
|
+
bids TEXT NOT NULL,
|
|
154
|
+
asks TEXT NOT NULL,
|
|
155
|
+
created_at DATETIME NOT NULL
|
|
156
|
+
)
|
|
157
|
+
`);
|
|
158
|
+
};
|
|
159
|
+
const getBalanceRow = async (accountName, asset) => {
|
|
160
|
+
const rows = await state.adapter.query('SELECT available, locked FROM exchange_balances WHERE account = ? AND asset = ?', [accountName, asset]);
|
|
161
|
+
if (!rows || rows.length === 0) {
|
|
162
|
+
await state.adapter.query('INSERT INTO exchange_balances (account, asset, available, locked) VALUES (?, ?, ?, ?)', [accountName, asset, '0', '0']);
|
|
163
|
+
return { available: new bignumber_js_1.default(0), locked: new bignumber_js_1.default(0) };
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
available: new bignumber_js_1.default(rows[0].available || '0'),
|
|
167
|
+
locked: new bignumber_js_1.default(rows[0].locked || '0')
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
const setBalanceRow = async (accountName, asset, available, locked) => {
|
|
171
|
+
await state.adapter.query('UPDATE exchange_balances SET available = ?, locked = ? WHERE account = ? AND asset = ?', [formatAmount(available, getAssetPrecision(asset)), formatAmount(locked, getAssetPrecision(asset)), accountName, asset]);
|
|
172
|
+
};
|
|
173
|
+
const ensurePairActive = async (base, quote) => {
|
|
174
|
+
const rows = await state.adapter.query('SELECT active FROM exchange_pairs WHERE base_asset = ? AND quote_asset = ?', [base, quote]);
|
|
175
|
+
if (!rows || rows.length === 0 || rows[0].active !== 1) {
|
|
176
|
+
throw new Error(`Trading pair ${base}/${quote} is not active`);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const createPair = async (payload, ctx) => {
|
|
180
|
+
if (payload.base === payload.quote) {
|
|
181
|
+
throw new Error('Base and quote assets must differ');
|
|
182
|
+
}
|
|
183
|
+
const existing = await state.adapter.query('SELECT base_asset FROM exchange_pairs WHERE base_asset = ? AND quote_asset = ?', [payload.base, payload.quote]);
|
|
184
|
+
if (existing && existing.length > 0) {
|
|
185
|
+
throw new Error(`Pair ${payload.base}/${payload.quote} already exists`);
|
|
186
|
+
}
|
|
187
|
+
await state.adapter.query('INSERT INTO exchange_pairs (base_asset, quote_asset, active) VALUES (?, ?, 1)', [payload.base, payload.quote]);
|
|
188
|
+
await state.adapter.addEvent(new Date(), name, 'createPair', payload, {
|
|
189
|
+
action: 'pair_created',
|
|
190
|
+
data: {
|
|
191
|
+
base: payload.base,
|
|
192
|
+
quote: payload.quote,
|
|
193
|
+
createdBy: ctx.sender
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
const deposit = async (_payload, ctx) => {
|
|
198
|
+
if (!ctx.transfer) {
|
|
199
|
+
throw new Error('Transfer context required for deposits');
|
|
200
|
+
}
|
|
201
|
+
const amount = new bignumber_js_1.default(ctx.transfer.amount);
|
|
202
|
+
if (amount.isNaN() || amount.lte(0)) {
|
|
203
|
+
throw new Error('Invalid deposit amount');
|
|
204
|
+
}
|
|
205
|
+
const balance = await getBalanceRow(ctx.sender, ctx.transfer.asset);
|
|
206
|
+
const nextAvailable = balance.available.plus(amount);
|
|
207
|
+
await setBalanceRow(ctx.sender, ctx.transfer.asset, nextAvailable, balance.locked);
|
|
208
|
+
await state.adapter.query('INSERT INTO exchange_deposits (account, asset, amount, block_number, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?)', [ctx.sender, ctx.transfer.asset, ctx.transfer.amount, ctx.block.number, ctx.transaction.id, new Date()]);
|
|
209
|
+
await state.adapter.addEvent(new Date(), name, 'deposit', { asset: ctx.transfer.asset, amount: ctx.transfer.amount }, {
|
|
210
|
+
action: 'deposit',
|
|
211
|
+
data: {
|
|
212
|
+
account: ctx.sender,
|
|
213
|
+
asset: ctx.transfer.asset,
|
|
214
|
+
amount: ctx.transfer.amount
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
const withdraw = async (payload, ctx) => {
|
|
219
|
+
const amount = new bignumber_js_1.default(payload.amount);
|
|
220
|
+
if (amount.isNaN() || amount.lte(0)) {
|
|
221
|
+
throw new Error('Invalid withdrawal amount');
|
|
222
|
+
}
|
|
223
|
+
const balance = await getBalanceRow(ctx.sender, payload.asset);
|
|
224
|
+
if (balance.available.lt(amount)) {
|
|
225
|
+
throw new Error('Insufficient available balance');
|
|
226
|
+
}
|
|
227
|
+
const nextAvailable = balance.available.minus(amount);
|
|
228
|
+
await setBalanceRow(ctx.sender, payload.asset, nextAvailable, balance.locked);
|
|
229
|
+
const withdrawalId = await state.adapter.query('INSERT INTO exchange_withdrawals (account, asset, amount, status, block_number, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [ctx.sender, payload.asset, payload.amount, 'pending', ctx.block.number, ctx.transaction.id, new Date()]);
|
|
230
|
+
try {
|
|
231
|
+
const to = payload.to || ctx.sender;
|
|
232
|
+
await state.streamer.transferHiveTokens(account, to, payload.amount, payload.asset, 'Exchange withdrawal');
|
|
233
|
+
await state.adapter.query('UPDATE exchange_withdrawals SET status = ? WHERE id = ?', ['completed', withdrawalId?.insertId ?? withdrawalId?.lastID ?? null]);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
await setBalanceRow(ctx.sender, payload.asset, balance.available, balance.locked);
|
|
237
|
+
await state.adapter.query('UPDATE exchange_withdrawals SET status = ? WHERE id = ?', ['failed', withdrawalId?.insertId ?? withdrawalId?.lastID ?? null]);
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
const placeOrder = async (payload, ctx) => {
|
|
242
|
+
await ensurePairActive(payload.base, payload.quote);
|
|
243
|
+
const price = new bignumber_js_1.default(payload.price);
|
|
244
|
+
const amount = new bignumber_js_1.default(payload.amount);
|
|
245
|
+
if (price.isNaN() || price.lte(0) || amount.isNaN() || amount.lte(0)) {
|
|
246
|
+
throw new Error('Invalid price or amount');
|
|
247
|
+
}
|
|
248
|
+
const orderId = (0, uuid_1.v4)();
|
|
249
|
+
if (payload.side === 'buy') {
|
|
250
|
+
const cost = price.multipliedBy(amount);
|
|
251
|
+
const balance = await getBalanceRow(ctx.sender, payload.quote);
|
|
252
|
+
if (balance.available.lt(cost)) {
|
|
253
|
+
throw new Error('Insufficient quote balance');
|
|
254
|
+
}
|
|
255
|
+
await setBalanceRow(ctx.sender, payload.quote, balance.available.minus(cost), balance.locked.plus(cost));
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const balance = await getBalanceRow(ctx.sender, payload.base);
|
|
259
|
+
if (balance.available.lt(amount)) {
|
|
260
|
+
throw new Error('Insufficient base balance');
|
|
261
|
+
}
|
|
262
|
+
await setBalanceRow(ctx.sender, payload.base, balance.available.minus(amount), balance.locked.plus(amount));
|
|
263
|
+
}
|
|
264
|
+
await state.adapter.query('INSERT INTO exchange_orders (id, account, side, base_asset, quote_asset, price, amount, remaining, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
265
|
+
orderId,
|
|
266
|
+
ctx.sender,
|
|
267
|
+
payload.side,
|
|
268
|
+
payload.base,
|
|
269
|
+
payload.quote,
|
|
270
|
+
formatAmount(price, quotePrecision),
|
|
271
|
+
formatAmount(amount, basePrecision),
|
|
272
|
+
formatAmount(amount, basePrecision),
|
|
273
|
+
'open',
|
|
274
|
+
new Date()
|
|
275
|
+
]);
|
|
276
|
+
await state.adapter.addEvent(new Date(), name, 'placeOrder', payload, {
|
|
277
|
+
action: 'order_opened',
|
|
278
|
+
data: {
|
|
279
|
+
orderId,
|
|
280
|
+
account: ctx.sender,
|
|
281
|
+
side: payload.side,
|
|
282
|
+
base: payload.base,
|
|
283
|
+
quote: payload.quote,
|
|
284
|
+
price: price.toFixed(),
|
|
285
|
+
amount: amount.toFixed()
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
};
|
|
289
|
+
const cancelOrder = async (payload, ctx) => {
|
|
290
|
+
const rows = await state.adapter.query('SELECT * FROM exchange_orders WHERE id = ?', [payload.orderId]);
|
|
291
|
+
if (!rows || rows.length === 0) {
|
|
292
|
+
throw new Error('Order not found');
|
|
293
|
+
}
|
|
294
|
+
const order = rows[0];
|
|
295
|
+
if (order.account !== ctx.sender) {
|
|
296
|
+
throw new Error('Not authorized to cancel this order');
|
|
297
|
+
}
|
|
298
|
+
if (order.status !== 'open' && order.status !== 'partial') {
|
|
299
|
+
throw new Error('Order cannot be canceled');
|
|
300
|
+
}
|
|
301
|
+
const remaining = new bignumber_js_1.default(order.remaining);
|
|
302
|
+
if (order.side === 'buy') {
|
|
303
|
+
const price = new bignumber_js_1.default(order.price);
|
|
304
|
+
const refund = price.multipliedBy(remaining);
|
|
305
|
+
const balance = await getBalanceRow(order.account, order.quote_asset);
|
|
306
|
+
await setBalanceRow(order.account, order.quote_asset, balance.available.plus(refund), balance.locked.minus(refund));
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const balance = await getBalanceRow(order.account, order.base_asset);
|
|
310
|
+
await setBalanceRow(order.account, order.base_asset, balance.available.plus(remaining), balance.locked.minus(remaining));
|
|
311
|
+
}
|
|
312
|
+
await state.adapter.query('UPDATE exchange_orders SET status = ?, remaining = ? WHERE id = ?', ['canceled', '0', payload.orderId]);
|
|
313
|
+
await state.adapter.addEvent(new Date(), name, 'cancelOrder', payload, {
|
|
314
|
+
action: 'order_canceled',
|
|
315
|
+
data: {
|
|
316
|
+
orderId: payload.orderId,
|
|
317
|
+
account: ctx.sender
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
};
|
|
321
|
+
const snapshotOrderBook = async (payload) => {
|
|
322
|
+
const depth = payload.depth ?? 20;
|
|
323
|
+
const buys = await state.adapter.query(`SELECT price, remaining FROM exchange_orders
|
|
324
|
+
WHERE base_asset = ? AND quote_asset = ? AND side = 'buy' AND status IN ('open', 'partial')
|
|
325
|
+
ORDER BY CAST(price AS REAL) DESC, created_at ASC`, [payload.base, payload.quote]);
|
|
326
|
+
const sells = await state.adapter.query(`SELECT price, remaining FROM exchange_orders
|
|
327
|
+
WHERE base_asset = ? AND quote_asset = ? AND side = 'sell' AND status IN ('open', 'partial')
|
|
328
|
+
ORDER BY CAST(price AS REAL) ASC, created_at ASC`, [payload.base, payload.quote]);
|
|
329
|
+
const aggregateSide = (orders) => {
|
|
330
|
+
const levels = new Map();
|
|
331
|
+
orders.forEach(order => {
|
|
332
|
+
const price = String(order.price);
|
|
333
|
+
const amount = new bignumber_js_1.default(order.remaining || '0');
|
|
334
|
+
if (!levels.has(price)) {
|
|
335
|
+
levels.set(price, amount);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
levels.set(price, levels.get(price).plus(amount));
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
return Array.from(levels.entries()).slice(0, depth).map(([price, amount]) => ({
|
|
342
|
+
price,
|
|
343
|
+
amount: formatAmount(amount, basePrecision)
|
|
344
|
+
}));
|
|
345
|
+
};
|
|
346
|
+
const bids = aggregateSide(buys);
|
|
347
|
+
const asks = aggregateSide(sells);
|
|
348
|
+
await state.adapter.query('INSERT INTO exchange_orderbook_snapshots (base_asset, quote_asset, bids, asks, created_at) VALUES (?, ?, ?, ?, ?)', [payload.base, payload.quote, JSON.stringify(bids), JSON.stringify(asks), new Date()]);
|
|
349
|
+
};
|
|
350
|
+
const matchOrders = async (payload = {}, _ctx) => {
|
|
351
|
+
const limit = payload.limit ?? 50;
|
|
352
|
+
let matched = 0;
|
|
353
|
+
const pairs = payload.base && payload.quote
|
|
354
|
+
? [{ base_asset: payload.base, quote_asset: payload.quote }]
|
|
355
|
+
: await state.adapter.query('SELECT base_asset, quote_asset FROM exchange_pairs WHERE active = 1');
|
|
356
|
+
for (const pair of pairs) {
|
|
357
|
+
while (matched < limit) {
|
|
358
|
+
const buyOrders = await state.adapter.query(`SELECT * FROM exchange_orders
|
|
359
|
+
WHERE base_asset = ? AND quote_asset = ? AND side = 'buy' AND status IN ('open', 'partial')
|
|
360
|
+
ORDER BY CAST(price AS REAL) DESC, created_at ASC LIMIT 1`, [pair.base_asset, pair.quote_asset]);
|
|
361
|
+
const sellOrders = await state.adapter.query(`SELECT * FROM exchange_orders
|
|
362
|
+
WHERE base_asset = ? AND quote_asset = ? AND side = 'sell' AND status IN ('open', 'partial')
|
|
363
|
+
ORDER BY CAST(price AS REAL) ASC, created_at ASC LIMIT 1`, [pair.base_asset, pair.quote_asset]);
|
|
364
|
+
if (!buyOrders.length || !sellOrders.length) {
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
const buy = buyOrders[0];
|
|
368
|
+
const sell = sellOrders[0];
|
|
369
|
+
const buyPrice = new bignumber_js_1.default(buy.price);
|
|
370
|
+
const sellPrice = new bignumber_js_1.default(sell.price);
|
|
371
|
+
if (buyPrice.lt(sellPrice)) {
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
const tradePrice = sellPrice;
|
|
375
|
+
const buyRemaining = new bignumber_js_1.default(buy.remaining);
|
|
376
|
+
const sellRemaining = new bignumber_js_1.default(sell.remaining);
|
|
377
|
+
const tradeAmount = bignumber_js_1.default.minimum(buyRemaining, sellRemaining);
|
|
378
|
+
const tradeQuote = tradePrice.multipliedBy(tradeAmount);
|
|
379
|
+
const buyCreatedAt = new Date(buy.created_at || buy.createdAt);
|
|
380
|
+
const sellCreatedAt = new Date(sell.created_at || sell.createdAt);
|
|
381
|
+
const buyIsMaker = buyCreatedAt <= sellCreatedAt;
|
|
382
|
+
const buyerFeeBps = buyIsMaker ? makerFeeBps : takerFeeBps;
|
|
383
|
+
const sellerFeeBps = buyIsMaker ? takerFeeBps : makerFeeBps;
|
|
384
|
+
const buyerFeeBase = calculateFee(tradeAmount, buyerFeeBps);
|
|
385
|
+
const sellerFeeQuote = calculateFee(tradeQuote, sellerFeeBps);
|
|
386
|
+
// Update buyer balances
|
|
387
|
+
const buyerBase = await getBalanceRow(buy.account, buy.base_asset);
|
|
388
|
+
const buyerQuote = await getBalanceRow(buy.account, buy.quote_asset);
|
|
389
|
+
const nextBuyRemaining = buyRemaining.minus(tradeAmount);
|
|
390
|
+
const nextBuyLocked = buyPrice.multipliedBy(nextBuyRemaining);
|
|
391
|
+
const buyerQuoteAvailable = buyerQuote.available.plus(buyerQuote.locked.minus(nextBuyLocked));
|
|
392
|
+
await setBalanceRow(buy.account, buy.base_asset, buyerBase.available.plus(tradeAmount.minus(buyerFeeBase)), buyerBase.locked);
|
|
393
|
+
await setBalanceRow(buy.account, buy.quote_asset, buyerQuoteAvailable, nextBuyLocked);
|
|
394
|
+
// Update seller balances
|
|
395
|
+
const sellerBase = await getBalanceRow(sell.account, sell.base_asset);
|
|
396
|
+
const sellerQuote = await getBalanceRow(sell.account, sell.quote_asset);
|
|
397
|
+
const nextSellRemaining = sellRemaining.minus(tradeAmount);
|
|
398
|
+
const nextSellLocked = nextSellRemaining;
|
|
399
|
+
await setBalanceRow(sell.account, sell.base_asset, sellerBase.available, nextSellLocked);
|
|
400
|
+
await setBalanceRow(sell.account, sell.quote_asset, sellerQuote.available.plus(tradeQuote.minus(sellerFeeQuote)), sellerQuote.locked);
|
|
401
|
+
if (buyerFeeBase.gt(0)) {
|
|
402
|
+
const feeBaseBalance = await getBalanceRow(feeAccount, buy.base_asset);
|
|
403
|
+
await setBalanceRow(feeAccount, buy.base_asset, feeBaseBalance.available.plus(buyerFeeBase), feeBaseBalance.locked);
|
|
404
|
+
}
|
|
405
|
+
if (sellerFeeQuote.gt(0)) {
|
|
406
|
+
const feeQuoteBalance = await getBalanceRow(feeAccount, sell.quote_asset);
|
|
407
|
+
await setBalanceRow(feeAccount, sell.quote_asset, feeQuoteBalance.available.plus(sellerFeeQuote), feeQuoteBalance.locked);
|
|
408
|
+
}
|
|
409
|
+
await state.adapter.query('UPDATE exchange_orders SET remaining = ?, status = ? WHERE id = ?', [formatAmount(nextBuyRemaining, basePrecision), nextBuyRemaining.eq(0) ? 'filled' : 'partial', buy.id]);
|
|
410
|
+
await state.adapter.query('UPDATE exchange_orders SET remaining = ?, status = ? WHERE id = ?', [formatAmount(nextSellRemaining, basePrecision), nextSellRemaining.eq(0) ? 'filled' : 'partial', sell.id]);
|
|
411
|
+
await state.adapter.query('INSERT INTO exchange_trades (buy_order_id, sell_order_id, price, amount, base_asset, quote_asset, buyer, seller, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [
|
|
412
|
+
buy.id,
|
|
413
|
+
sell.id,
|
|
414
|
+
formatAmount(tradePrice, quotePrecision),
|
|
415
|
+
formatAmount(tradeAmount, basePrecision),
|
|
416
|
+
buy.base_asset,
|
|
417
|
+
buy.quote_asset,
|
|
418
|
+
buy.account,
|
|
419
|
+
sell.account,
|
|
420
|
+
new Date()
|
|
421
|
+
]);
|
|
422
|
+
await state.adapter.addEvent(new Date(), name, 'matchOrders', { base: pair.base_asset, quote: pair.quote_asset }, {
|
|
423
|
+
action: 'trade',
|
|
424
|
+
data: {
|
|
425
|
+
buyOrderId: buy.id,
|
|
426
|
+
sellOrderId: sell.id,
|
|
427
|
+
price: tradePrice.toFixed(),
|
|
428
|
+
amount: tradeAmount.toFixed(),
|
|
429
|
+
buyer: buy.account,
|
|
430
|
+
seller: sell.account,
|
|
431
|
+
buyerFeeBase: buyerFeeBase.toFixed(),
|
|
432
|
+
sellerFeeQuote: sellerFeeQuote.toFixed(),
|
|
433
|
+
maker: buyIsMaker ? buy.account : sell.account,
|
|
434
|
+
taker: buyIsMaker ? sell.account : buy.account
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
matched += 1;
|
|
438
|
+
}
|
|
439
|
+
if (payload.snapshot) {
|
|
440
|
+
await snapshotOrderBook({ base: pair.base_asset, quote: pair.quote_asset, depth: payload.depth });
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
const internalTransfer = async (payload, ctx) => {
|
|
445
|
+
const amount = new bignumber_js_1.default(payload.amount);
|
|
446
|
+
if (amount.isNaN() || amount.lte(0)) {
|
|
447
|
+
throw new Error('Invalid transfer amount');
|
|
448
|
+
}
|
|
449
|
+
const senderBalance = await getBalanceRow(ctx.sender, payload.asset);
|
|
450
|
+
if (senderBalance.available.lt(amount)) {
|
|
451
|
+
throw new Error('Insufficient available balance');
|
|
452
|
+
}
|
|
453
|
+
const recipientBalance = await getBalanceRow(payload.to, payload.asset);
|
|
454
|
+
await setBalanceRow(ctx.sender, payload.asset, senderBalance.available.minus(amount), senderBalance.locked);
|
|
455
|
+
await setBalanceRow(payload.to, payload.asset, recipientBalance.available.plus(amount), recipientBalance.locked);
|
|
456
|
+
await state.adapter.addEvent(new Date(), name, 'transfer', payload, {
|
|
457
|
+
action: 'internal_transfer',
|
|
458
|
+
data: {
|
|
459
|
+
from: ctx.sender,
|
|
460
|
+
to: payload.to,
|
|
461
|
+
asset: payload.asset,
|
|
462
|
+
amount: payload.amount
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
};
|
|
466
|
+
return (0, contract_1.defineContract)({
|
|
467
|
+
name,
|
|
468
|
+
hooks: {
|
|
469
|
+
create: async ({ adapter, streamer }) => {
|
|
470
|
+
state.adapter = adapter;
|
|
471
|
+
state.streamer = streamer;
|
|
472
|
+
try {
|
|
473
|
+
await initializeTables();
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
throw new Error('ExchangeContract requires a SQL-capable adapter');
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
actions: {
|
|
481
|
+
createPair: (0, contract_1.action)(createPair, { schema: createPairSchema, trigger: 'custom_json' }),
|
|
482
|
+
deposit: (0, contract_1.action)(deposit, { schema: depositSchema, trigger: 'transfer' }),
|
|
483
|
+
withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json', requiresActiveKey: true }),
|
|
484
|
+
placeOrder: (0, contract_1.action)(placeOrder, { schema: placeOrderSchema, trigger: 'custom_json' }),
|
|
485
|
+
cancelOrder: (0, contract_1.action)(cancelOrder, { schema: cancelOrderSchema, trigger: 'custom_json' }),
|
|
486
|
+
matchOrders: (0, contract_1.action)(matchOrders, { schema: matchOrdersSchema, trigger: 'time' }),
|
|
487
|
+
snapshotOrderBook: (0, contract_1.action)(snapshotOrderBook, { schema: snapshotSchema, trigger: ['time', 'custom_json'] }),
|
|
488
|
+
transfer: (0, contract_1.action)(internalTransfer, { schema: transferSchema, trigger: 'custom_json' })
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=exchange.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.contract.js","sourceRoot":"","sources":["../../src/contracts/exchange.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
amount: any;
|
|
16
|
-
}): Promise<any>;
|
|
17
|
-
drawHourlyLottery(): Promise<any[]>;
|
|
18
|
-
drawDailyLottery(): Promise<any[]>;
|
|
19
|
-
getWinners(count: number, entries: any[]): Promise<any[]>;
|
|
1
|
+
export interface LottoContractOptions {
|
|
2
|
+
name?: string;
|
|
3
|
+
account?: string;
|
|
4
|
+
feeAccount?: string;
|
|
5
|
+
tokenSymbol?: string;
|
|
6
|
+
validCurrencies?: string[];
|
|
7
|
+
validDrawTypes?: string[];
|
|
8
|
+
cost?: number;
|
|
9
|
+
minEntriesHourly?: number;
|
|
10
|
+
minEntriesDaily?: number;
|
|
11
|
+
hourlyWinnersPick?: number;
|
|
12
|
+
dailyWinnersPick?: number;
|
|
13
|
+
maxTicketsPerUser?: number;
|
|
14
|
+
feePercentage?: number;
|
|
20
15
|
}
|
|
16
|
+
export declare function createLottoContract(options?: LottoContractOptions): import("..").ContractDefinition;
|