hive-stream 3.0.1 → 3.0.3
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/DOCUMENTATION.md +66 -2
- package/README.md +95 -24
- package/dist/adapters/base.adapter.d.ts +5 -0
- package/dist/adapters/base.adapter.js +9 -0
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +6 -6
- package/dist/adapters/mongodb.adapter.js +36 -21
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +7 -0
- package/dist/adapters/postgresql.adapter.js +46 -19
- package/dist/adapters/postgresql.adapter.js.map +1 -1
- package/dist/adapters/sqlite.adapter.d.ts +4 -0
- package/dist/adapters/sqlite.adapter.js +10 -0
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.d.ts +13 -3
- package/dist/api.js +96 -62
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +29 -0
- package/dist/config.js +77 -2
- package/dist/config.js.map +1 -1
- package/dist/contracts/auctionhouse.contract.d.ts +4 -0
- package/dist/contracts/auctionhouse.contract.js +234 -0
- package/dist/contracts/auctionhouse.contract.js.map +1 -0
- package/dist/contracts/booking.contract.d.ts +4 -0
- package/dist/contracts/booking.contract.js +225 -0
- package/dist/contracts/booking.contract.js.map +1 -0
- package/dist/contracts/bountyboard.contract.d.ts +4 -0
- package/dist/contracts/bountyboard.contract.js +233 -0
- package/dist/contracts/bountyboard.contract.js.map +1 -0
- package/dist/contracts/bundlemarketplace.contract.d.ts +4 -0
- package/dist/contracts/bundlemarketplace.contract.js +195 -0
- package/dist/contracts/bundlemarketplace.contract.js.map +1 -0
- package/dist/contracts/charitymatch.contract.d.ts +4 -0
- package/dist/contracts/charitymatch.contract.js +172 -0
- package/dist/contracts/charitymatch.contract.js.map +1 -0
- package/dist/contracts/coinflip.contract.js +7 -1
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/crowdfund.contract.d.ts +4 -0
- package/dist/contracts/crowdfund.contract.js +290 -0
- package/dist/contracts/crowdfund.contract.js.map +1 -0
- package/dist/contracts/dcabot.contract.d.ts +4 -0
- package/dist/contracts/dcabot.contract.js +217 -0
- package/dist/contracts/dcabot.contract.js.map +1 -0
- package/dist/contracts/dice.contract.js +7 -1
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/domainregistry.contract.d.ts +4 -0
- package/dist/contracts/domainregistry.contract.js +232 -0
- package/dist/contracts/domainregistry.contract.js.map +1 -0
- package/dist/contracts/exchange.contract.js +209 -168
- package/dist/contracts/exchange.contract.js.map +1 -1
- package/dist/contracts/fanclub.contract.d.ts +4 -0
- package/dist/contracts/fanclub.contract.js +193 -0
- package/dist/contracts/fanclub.contract.js.map +1 -0
- package/dist/contracts/giftcard.contract.d.ts +4 -0
- package/dist/contracts/giftcard.contract.js +158 -0
- package/dist/contracts/giftcard.contract.js.map +1 -0
- package/dist/contracts/grantrounds.contract.d.ts +4 -0
- package/dist/contracts/grantrounds.contract.js +265 -0
- package/dist/contracts/grantrounds.contract.js.map +1 -0
- package/dist/contracts/groupbuy.contract.d.ts +4 -0
- package/dist/contracts/groupbuy.contract.js +198 -0
- package/dist/contracts/groupbuy.contract.js.map +1 -0
- package/dist/contracts/helpers.d.ts +64 -0
- package/dist/contracts/helpers.js +159 -0
- package/dist/contracts/helpers.js.map +1 -0
- package/dist/contracts/insurancepool.contract.d.ts +4 -0
- package/dist/contracts/insurancepool.contract.js +281 -0
- package/dist/contracts/insurancepool.contract.js.map +1 -0
- package/dist/contracts/invoice.contract.d.ts +4 -0
- package/dist/contracts/invoice.contract.js +193 -0
- package/dist/contracts/invoice.contract.js.map +1 -0
- package/dist/contracts/launchpad.contract.d.ts +4 -0
- package/dist/contracts/launchpad.contract.js +225 -0
- package/dist/contracts/launchpad.contract.js.map +1 -0
- package/dist/contracts/lotto.contract.js +53 -37
- package/dist/contracts/lotto.contract.js.map +1 -1
- package/dist/contracts/multisigtreasury.contract.d.ts +4 -0
- package/dist/contracts/multisigtreasury.contract.js +245 -0
- package/dist/contracts/multisigtreasury.contract.js.map +1 -0
- package/dist/contracts/nft.contract.d.ts +1 -0
- package/dist/contracts/nft.contract.js +236 -192
- package/dist/contracts/nft.contract.js.map +1 -1
- package/dist/contracts/oraclebounty.contract.d.ts +4 -0
- package/dist/contracts/oraclebounty.contract.js +250 -0
- package/dist/contracts/oraclebounty.contract.js.map +1 -0
- package/dist/contracts/payroll.contract.d.ts +4 -0
- package/dist/contracts/payroll.contract.js +232 -0
- package/dist/contracts/payroll.contract.js.map +1 -0
- package/dist/contracts/paywall.contract.d.ts +4 -0
- package/dist/contracts/paywall.contract.js +185 -0
- package/dist/contracts/paywall.contract.js.map +1 -0
- package/dist/contracts/poll.contract.js +2 -0
- package/dist/contracts/poll.contract.js.map +1 -1
- package/dist/contracts/predictionmarket.contract.d.ts +4 -0
- package/dist/contracts/predictionmarket.contract.js +213 -0
- package/dist/contracts/predictionmarket.contract.js.map +1 -0
- package/dist/contracts/proposaltimelock.contract.d.ts +4 -0
- package/dist/contracts/proposaltimelock.contract.js +250 -0
- package/dist/contracts/proposaltimelock.contract.js.map +1 -0
- package/dist/contracts/questpass.contract.d.ts +4 -0
- package/dist/contracts/questpass.contract.js +214 -0
- package/dist/contracts/questpass.contract.js.map +1 -0
- package/dist/contracts/referral.contract.d.ts +4 -0
- package/dist/contracts/referral.contract.js +238 -0
- package/dist/contracts/referral.contract.js.map +1 -0
- package/dist/contracts/rental.contract.d.ts +4 -0
- package/dist/contracts/rental.contract.js +221 -0
- package/dist/contracts/rental.contract.js.map +1 -0
- package/dist/contracts/revenuesplit.contract.d.ts +4 -0
- package/dist/contracts/revenuesplit.contract.js +211 -0
- package/dist/contracts/revenuesplit.contract.js.map +1 -0
- package/dist/contracts/rps.contract.js +17 -1
- package/dist/contracts/rps.contract.js.map +1 -1
- package/dist/contracts/savings.contract.d.ts +4 -0
- package/dist/contracts/savings.contract.js +208 -0
- package/dist/contracts/savings.contract.js.map +1 -0
- package/dist/contracts/subscription.contract.d.ts +4 -0
- package/dist/contracts/subscription.contract.js +241 -0
- package/dist/contracts/subscription.contract.js.map +1 -0
- package/dist/contracts/sweepstakes.contract.d.ts +4 -0
- package/dist/contracts/sweepstakes.contract.js +209 -0
- package/dist/contracts/sweepstakes.contract.js.map +1 -0
- package/dist/contracts/ticketing.contract.d.ts +4 -0
- package/dist/contracts/ticketing.contract.js +185 -0
- package/dist/contracts/ticketing.contract.js.map +1 -0
- package/dist/contracts/tipjar.contract.js +2 -0
- package/dist/contracts/tipjar.contract.js.map +1 -1
- package/dist/contracts/token.contract.js +135 -125
- package/dist/contracts/token.contract.js.map +1 -1
- package/dist/index.d.ts +40 -0
- package/dist/index.js +72 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +70 -0
- package/dist/metadata.js +470 -0
- package/dist/metadata.js.map +1 -0
- package/dist/providers/block-provider.d.ts +22 -0
- package/dist/providers/block-provider.js +3 -0
- package/dist/providers/block-provider.js.map +1 -0
- package/dist/providers/haf-client.d.ts +30 -0
- package/dist/providers/haf-client.js +119 -0
- package/dist/providers/haf-client.js.map +1 -0
- package/dist/providers/haf-provider.d.ts +49 -0
- package/dist/providers/haf-provider.js +256 -0
- package/dist/providers/haf-provider.js.map +1 -0
- package/dist/providers/hive-provider.d.ts +13 -0
- package/dist/providers/hive-provider.js +25 -0
- package/dist/providers/hive-provider.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.js +21 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/streamer.d.ts +24 -4
- package/dist/streamer.js +196 -69
- package/dist/streamer.js.map +1 -1
- package/dist/utils.js +11 -2
- package/dist/utils.js.map +1 -1
- package/package.json +16 -1
- package/.claude/settings.local.json +0 -12
- package/.env.example +0 -3
- package/.travis.yml +0 -11
- package/AGENTS.md +0 -35
- package/CLAUDE.md +0 -75
- package/ecosystem.config.js +0 -17
- package/examples/contracts/README.md +0 -8
- package/examples/contracts/exchange.ts +0 -38
- package/examples/contracts/poll.ts +0 -21
- package/examples/contracts/rps.ts +0 -19
- package/examples/contracts/tipjar.ts +0 -19
- package/jest.config.js +0 -9
- package/test-contract-block.md +0 -19
- package/tests/actions.spec.ts +0 -252
- package/tests/adapters/actions-persistence.spec.ts +0 -144
- package/tests/adapters/postgresql.adapter.spec.ts +0 -127
- package/tests/adapters/sqlite.adapter.spec.ts +0 -181
- package/tests/contracts/coinflip.contract.spec.ts +0 -94
- package/tests/contracts/dice.contract.spec.ts +0 -87
- package/tests/contracts/entrants.json +0 -729
- package/tests/contracts/exchange.contract.spec.ts +0 -84
- package/tests/contracts/lotto.contract.spec.ts +0 -59
- package/tests/contracts/nft.contract.spec.ts +0 -948
- package/tests/contracts/token.contract.spec.ts +0 -90
- package/tests/exchanges/coingecko.exchange.spec.ts +0 -169
- package/tests/exchanges/exchange.base.spec.ts +0 -246
- package/tests/helpers/mock-adapter.ts +0 -214
- package/tests/helpers/mock-fetch.ts +0 -165
- package/tests/hive-chain-features.spec.ts +0 -238
- package/tests/hive-rates.spec.ts +0 -443
- package/tests/integration/hive-rates.integration.spec.ts +0 -35
- package/tests/setup.ts +0 -30
- package/tests/streamer-actions.spec.ts +0 -274
- package/tests/streamer.spec.ts +0 -342
- package/tests/types/rates.spec.ts +0 -216
- package/tests/utils.spec.ts +0 -113
- package/tsconfig.build.json +0 -4
- package/tslint.json +0 -21
- package/wallaby.js +0 -26
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuctionHouseContract = createAuctionHouseContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'auctionhouse';
|
|
8
|
+
function createAuctionHouseContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createAuctionSchema = zod_1.z.object({
|
|
12
|
+
auctionId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
description: zod_1.z.string().max(1000).optional(),
|
|
15
|
+
assetType: zod_1.z.string().min(1).max(40).optional(),
|
|
16
|
+
assetRef: zod_1.z.string().min(1).max(140),
|
|
17
|
+
paymentAsset: helpers_1.assetSchema,
|
|
18
|
+
reservePrice: helpers_1.amountSchema,
|
|
19
|
+
buyNowPrice: helpers_1.amountSchema.optional(),
|
|
20
|
+
startsAt: zod_1.z.string().optional(),
|
|
21
|
+
endsAt: zod_1.z.string(),
|
|
22
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
23
|
+
});
|
|
24
|
+
const placeBidSchema = zod_1.z.object({
|
|
25
|
+
auctionId: helpers_1.identifierSchema,
|
|
26
|
+
note: zod_1.z.string().max(280).optional()
|
|
27
|
+
});
|
|
28
|
+
const settleSchema = zod_1.z.object({
|
|
29
|
+
auctionId: helpers_1.identifierSchema
|
|
30
|
+
});
|
|
31
|
+
const initialize = async () => {
|
|
32
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
33
|
+
`
|
|
34
|
+
CREATE TABLE IF NOT EXISTS auction_house_auctions (
|
|
35
|
+
auction_id TEXT PRIMARY KEY,
|
|
36
|
+
seller TEXT NOT NULL,
|
|
37
|
+
title TEXT NOT NULL,
|
|
38
|
+
description TEXT,
|
|
39
|
+
asset_type TEXT NOT NULL,
|
|
40
|
+
asset_ref TEXT NOT NULL,
|
|
41
|
+
payment_asset TEXT NOT NULL,
|
|
42
|
+
reserve_price TEXT NOT NULL,
|
|
43
|
+
buy_now_price TEXT,
|
|
44
|
+
starts_at DATETIME NOT NULL,
|
|
45
|
+
ends_at DATETIME NOT NULL,
|
|
46
|
+
status TEXT NOT NULL,
|
|
47
|
+
highest_bid TEXT,
|
|
48
|
+
highest_bidder TEXT,
|
|
49
|
+
created_at DATETIME NOT NULL,
|
|
50
|
+
settled_at DATETIME,
|
|
51
|
+
metadata TEXT
|
|
52
|
+
)
|
|
53
|
+
`,
|
|
54
|
+
`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS auction_house_bids (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
auction_id TEXT NOT NULL,
|
|
58
|
+
bidder TEXT NOT NULL,
|
|
59
|
+
amount TEXT NOT NULL,
|
|
60
|
+
asset TEXT NOT NULL,
|
|
61
|
+
note TEXT,
|
|
62
|
+
created_at DATETIME NOT NULL
|
|
63
|
+
)
|
|
64
|
+
`
|
|
65
|
+
]);
|
|
66
|
+
};
|
|
67
|
+
const createAuction = async (payload, ctx) => {
|
|
68
|
+
const seller = (0, helpers_1.requireSender)(ctx);
|
|
69
|
+
const existing = await state.adapter.query('SELECT auction_id FROM auction_house_auctions WHERE auction_id = ?', [payload.auctionId]);
|
|
70
|
+
if (existing.length > 0) {
|
|
71
|
+
throw new Error(`Auction ${payload.auctionId} already exists`);
|
|
72
|
+
}
|
|
73
|
+
const startsAt = (0, helpers_1.parseDateValue)(payload.startsAt) || new Date();
|
|
74
|
+
const endsAt = (0, helpers_1.parseDateValue)(payload.endsAt);
|
|
75
|
+
if (!endsAt || endsAt <= startsAt) {
|
|
76
|
+
throw new Error('Auction end date must be after the start date');
|
|
77
|
+
}
|
|
78
|
+
if (payload.buyNowPrice && (0, helpers_1.toBigNumber)(payload.buyNowPrice).lte(payload.reservePrice)) {
|
|
79
|
+
throw new Error('Buy now price must be greater than the reserve price');
|
|
80
|
+
}
|
|
81
|
+
await state.adapter.query(`INSERT INTO auction_house_auctions (
|
|
82
|
+
auction_id, seller, title, description, asset_type, asset_ref, payment_asset, reserve_price, buy_now_price,
|
|
83
|
+
starts_at, ends_at, status, highest_bid, highest_bidder, created_at, settled_at, metadata
|
|
84
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
85
|
+
payload.auctionId,
|
|
86
|
+
seller,
|
|
87
|
+
payload.title,
|
|
88
|
+
payload.description || '',
|
|
89
|
+
payload.assetType || 'item',
|
|
90
|
+
payload.assetRef,
|
|
91
|
+
payload.paymentAsset,
|
|
92
|
+
payload.reservePrice,
|
|
93
|
+
payload.buyNowPrice || null,
|
|
94
|
+
startsAt,
|
|
95
|
+
endsAt,
|
|
96
|
+
'open',
|
|
97
|
+
null,
|
|
98
|
+
null,
|
|
99
|
+
new Date(),
|
|
100
|
+
null,
|
|
101
|
+
JSON.stringify(payload.metadata || {})
|
|
102
|
+
]);
|
|
103
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createAuction', payload, {
|
|
104
|
+
action: 'auction_created',
|
|
105
|
+
data: {
|
|
106
|
+
auctionId: payload.auctionId,
|
|
107
|
+
seller,
|
|
108
|
+
paymentAsset: payload.paymentAsset,
|
|
109
|
+
reservePrice: payload.reservePrice
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
const placeBid = async (payload, ctx) => {
|
|
114
|
+
const bidder = (0, helpers_1.requireSender)(ctx);
|
|
115
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
116
|
+
const auctionRows = await state.adapter.query('SELECT * FROM auction_house_auctions WHERE auction_id = ?', [payload.auctionId]);
|
|
117
|
+
if (auctionRows.length === 0) {
|
|
118
|
+
throw new Error(`Auction ${payload.auctionId} does not exist`);
|
|
119
|
+
}
|
|
120
|
+
const auction = auctionRows[0];
|
|
121
|
+
const now = new Date();
|
|
122
|
+
const startsAt = (0, helpers_1.parseDateValue)(auction.starts_at) || now;
|
|
123
|
+
const endsAt = (0, helpers_1.parseDateValue)(auction.ends_at) || now;
|
|
124
|
+
if (auction.status !== 'open') {
|
|
125
|
+
throw new Error('Auction is not open for bids');
|
|
126
|
+
}
|
|
127
|
+
if (bidder === auction.seller) {
|
|
128
|
+
throw new Error('Seller cannot bid on their own auction');
|
|
129
|
+
}
|
|
130
|
+
if (startsAt > now) {
|
|
131
|
+
throw new Error('Auction has not started yet');
|
|
132
|
+
}
|
|
133
|
+
if (endsAt <= now) {
|
|
134
|
+
throw new Error('Auction has already ended');
|
|
135
|
+
}
|
|
136
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, auction.payment_asset);
|
|
137
|
+
const currentHighest = (0, helpers_1.toBigNumber)(auction.highest_bid || '0');
|
|
138
|
+
const nextBid = (0, helpers_1.toBigNumber)(payment.amount);
|
|
139
|
+
if (nextBid.lte(currentHighest)) {
|
|
140
|
+
throw new Error('Bid must be greater than the current highest bid');
|
|
141
|
+
}
|
|
142
|
+
await state.adapter.query('INSERT INTO auction_house_bids (auction_id, bidder, amount, asset, note, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.auctionId, bidder, payment.amount, payment.asset, payload.note || '', now]);
|
|
143
|
+
let status = 'open';
|
|
144
|
+
let settledAt = null;
|
|
145
|
+
const shouldSettle = auction.buy_now_price && nextBid.gte(auction.buy_now_price);
|
|
146
|
+
if (shouldSettle) {
|
|
147
|
+
status = 'settled';
|
|
148
|
+
settledAt = now;
|
|
149
|
+
}
|
|
150
|
+
await state.adapter.query('UPDATE auction_house_auctions SET highest_bid = ?, highest_bidder = ?, status = ?, settled_at = ? WHERE auction_id = ?', [payment.amount, bidder, status, settledAt, payload.auctionId]);
|
|
151
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'placeBid', payload, {
|
|
152
|
+
action: shouldSettle ? 'auction_settled' : 'auction_bid_placed',
|
|
153
|
+
data: {
|
|
154
|
+
auctionId: payload.auctionId,
|
|
155
|
+
bidder,
|
|
156
|
+
amount: payment.amount,
|
|
157
|
+
asset: payment.asset,
|
|
158
|
+
winner: shouldSettle ? bidder : null,
|
|
159
|
+
settled: shouldSettle
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
const settleAuction = async (payload, ctx) => {
|
|
164
|
+
const rows = await state.adapter.query('SELECT * FROM auction_house_auctions WHERE auction_id = ?', [payload.auctionId]);
|
|
165
|
+
if (rows.length === 0) {
|
|
166
|
+
throw new Error(`Auction ${payload.auctionId} does not exist`);
|
|
167
|
+
}
|
|
168
|
+
const auction = rows[0];
|
|
169
|
+
if (auction.status === 'settled' || auction.status === 'ended' || auction.status === 'cancelled') {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const sender = ctx.trigger === 'time' ? 'system' : (0, helpers_1.requireSender)(ctx);
|
|
173
|
+
if (ctx.trigger !== 'time' && sender !== auction.seller) {
|
|
174
|
+
throw new Error('Only the seller can settle this auction');
|
|
175
|
+
}
|
|
176
|
+
const endsAt = (0, helpers_1.parseDateValue)(auction.ends_at) || new Date();
|
|
177
|
+
if (ctx.trigger !== 'time' && endsAt > new Date()) {
|
|
178
|
+
throw new Error('Auction cannot be settled before it ends');
|
|
179
|
+
}
|
|
180
|
+
const highestBid = (0, helpers_1.toBigNumber)(auction.highest_bid || '0');
|
|
181
|
+
const reservePrice = (0, helpers_1.toBigNumber)(auction.reserve_price);
|
|
182
|
+
const status = auction.highest_bidder && highestBid.gte(reservePrice)
|
|
183
|
+
? 'settled'
|
|
184
|
+
: 'ended';
|
|
185
|
+
await state.adapter.query('UPDATE auction_house_auctions SET status = ?, settled_at = ? WHERE auction_id = ?', [status, new Date(), payload.auctionId]);
|
|
186
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'settleAuction', payload, {
|
|
187
|
+
action: 'auction_settled',
|
|
188
|
+
data: {
|
|
189
|
+
auctionId: payload.auctionId,
|
|
190
|
+
status,
|
|
191
|
+
winner: status === 'settled' ? auction.highest_bidder : null,
|
|
192
|
+
winningBid: status === 'settled' ? auction.highest_bid : null
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
const cancelAuction = async (payload, ctx) => {
|
|
197
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
198
|
+
const rows = await state.adapter.query('SELECT * FROM auction_house_auctions WHERE auction_id = ?', [payload.auctionId]);
|
|
199
|
+
if (rows.length === 0) {
|
|
200
|
+
throw new Error(`Auction ${payload.auctionId} does not exist`);
|
|
201
|
+
}
|
|
202
|
+
const auction = rows[0];
|
|
203
|
+
if (auction.seller !== sender) {
|
|
204
|
+
throw new Error('Only the seller can cancel this auction');
|
|
205
|
+
}
|
|
206
|
+
if (auction.highest_bidder) {
|
|
207
|
+
throw new Error('Cannot cancel an auction with bids');
|
|
208
|
+
}
|
|
209
|
+
await state.adapter.query('UPDATE auction_house_auctions SET status = ?, settled_at = ? WHERE auction_id = ?', ['cancelled', new Date(), payload.auctionId]);
|
|
210
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'cancelAuction', payload, {
|
|
211
|
+
action: 'auction_cancelled',
|
|
212
|
+
data: {
|
|
213
|
+
auctionId: payload.auctionId,
|
|
214
|
+
seller: sender
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
return (0, contract_1.defineContract)({
|
|
219
|
+
name,
|
|
220
|
+
hooks: {
|
|
221
|
+
create: async ({ adapter }) => {
|
|
222
|
+
state.adapter = adapter;
|
|
223
|
+
await initialize();
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
actions: {
|
|
227
|
+
createAuction: (0, contract_1.action)(createAuction, { schema: createAuctionSchema, trigger: 'custom_json' }),
|
|
228
|
+
placeBid: (0, contract_1.action)(placeBid, { schema: placeBidSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
229
|
+
settleAuction: (0, contract_1.action)(settleAuction, { schema: settleSchema, trigger: ['custom_json', 'time'] }),
|
|
230
|
+
cancelAuction: (0, contract_1.action)(cancelAuction, { schema: settleSchema, trigger: 'custom_json' })
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=auctionhouse.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auctionhouse.contract.js","sourceRoot":"","sources":["../../src/contracts/auctionhouse.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBookingContract = createBookingContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'bookings';
|
|
8
|
+
function createBookingContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createListingSchema = zod_1.z.object({
|
|
12
|
+
listingId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
price: helpers_1.amountSchema,
|
|
15
|
+
asset: helpers_1.assetSchema,
|
|
16
|
+
durationMinutes: zod_1.z.number().int().min(15).max(24 * 60),
|
|
17
|
+
cancellationHours: zod_1.z.number().int().min(0).max(720).optional(),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const reserveSchema = zod_1.z.object({
|
|
21
|
+
listingId: helpers_1.identifierSchema,
|
|
22
|
+
reservationId: helpers_1.identifierSchema,
|
|
23
|
+
startAt: zod_1.z.string(),
|
|
24
|
+
note: zod_1.z.string().max(280).optional()
|
|
25
|
+
});
|
|
26
|
+
const reservationSchema = zod_1.z.object({
|
|
27
|
+
reservationId: helpers_1.identifierSchema,
|
|
28
|
+
reason: zod_1.z.string().max(280).optional()
|
|
29
|
+
});
|
|
30
|
+
const initialize = async () => {
|
|
31
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
32
|
+
`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS booking_listings (
|
|
34
|
+
listing_id TEXT PRIMARY KEY,
|
|
35
|
+
owner TEXT NOT NULL,
|
|
36
|
+
title TEXT NOT NULL,
|
|
37
|
+
price TEXT NOT NULL,
|
|
38
|
+
asset TEXT NOT NULL,
|
|
39
|
+
duration_minutes INTEGER NOT NULL,
|
|
40
|
+
cancellation_hours INTEGER NOT NULL,
|
|
41
|
+
active INTEGER NOT NULL,
|
|
42
|
+
metadata TEXT,
|
|
43
|
+
created_at DATETIME NOT NULL
|
|
44
|
+
)
|
|
45
|
+
`,
|
|
46
|
+
`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS booking_reservations (
|
|
48
|
+
reservation_id TEXT PRIMARY KEY,
|
|
49
|
+
listing_id TEXT NOT NULL,
|
|
50
|
+
booker TEXT NOT NULL,
|
|
51
|
+
start_at DATETIME NOT NULL,
|
|
52
|
+
end_at DATETIME NOT NULL,
|
|
53
|
+
amount TEXT NOT NULL,
|
|
54
|
+
asset TEXT NOT NULL,
|
|
55
|
+
note TEXT,
|
|
56
|
+
status TEXT NOT NULL,
|
|
57
|
+
created_at DATETIME NOT NULL,
|
|
58
|
+
updated_at DATETIME NOT NULL
|
|
59
|
+
)
|
|
60
|
+
`
|
|
61
|
+
]);
|
|
62
|
+
};
|
|
63
|
+
const createListing = async (payload, ctx) => {
|
|
64
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
65
|
+
const existing = await state.adapter.query('SELECT listing_id FROM booking_listings WHERE listing_id = ?', [payload.listingId]);
|
|
66
|
+
if (existing.length > 0) {
|
|
67
|
+
throw new Error(`Listing ${payload.listingId} already exists`);
|
|
68
|
+
}
|
|
69
|
+
await state.adapter.query(`INSERT INTO booking_listings (
|
|
70
|
+
listing_id, owner, title, price, asset, duration_minutes, cancellation_hours, active, metadata, created_at
|
|
71
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
72
|
+
payload.listingId,
|
|
73
|
+
owner,
|
|
74
|
+
payload.title,
|
|
75
|
+
payload.price,
|
|
76
|
+
payload.asset,
|
|
77
|
+
payload.durationMinutes,
|
|
78
|
+
payload.cancellationHours || 0,
|
|
79
|
+
1,
|
|
80
|
+
JSON.stringify(payload.metadata || {}),
|
|
81
|
+
new Date()
|
|
82
|
+
]);
|
|
83
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createListing', payload, {
|
|
84
|
+
action: 'booking_listing_created',
|
|
85
|
+
data: {
|
|
86
|
+
listingId: payload.listingId,
|
|
87
|
+
owner
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
const reserve = async (payload, ctx) => {
|
|
92
|
+
const booker = (0, helpers_1.requireSender)(ctx);
|
|
93
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
94
|
+
const listings = await state.adapter.query('SELECT * FROM booking_listings WHERE listing_id = ?', [payload.listingId]);
|
|
95
|
+
if (listings.length === 0) {
|
|
96
|
+
throw new Error(`Listing ${payload.listingId} does not exist`);
|
|
97
|
+
}
|
|
98
|
+
const listing = listings[0];
|
|
99
|
+
if (!listing.active) {
|
|
100
|
+
throw new Error('Listing is not active');
|
|
101
|
+
}
|
|
102
|
+
const startAt = (0, helpers_1.parseDateValue)(payload.startAt);
|
|
103
|
+
if (!startAt || startAt <= new Date()) {
|
|
104
|
+
throw new Error('Reservation start time must be in the future');
|
|
105
|
+
}
|
|
106
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, listing.asset);
|
|
107
|
+
if (payment.amount !== listing.price) {
|
|
108
|
+
throw new Error('Reservation payment must match the listing price');
|
|
109
|
+
}
|
|
110
|
+
const endAt = new Date(startAt.getTime() + Number(listing.duration_minutes) * 60 * 1000);
|
|
111
|
+
const existing = await state.adapter.query('SELECT * FROM booking_reservations WHERE listing_id = ? AND status IN (?, ?)', [payload.listingId, 'pending', 'confirmed']);
|
|
112
|
+
for (const reservation of existing) {
|
|
113
|
+
const existingStart = (0, helpers_1.parseDateValue)(reservation.start_at) || startAt;
|
|
114
|
+
const existingEnd = (0, helpers_1.parseDateValue)(reservation.end_at) || endAt;
|
|
115
|
+
const overlaps = startAt < existingEnd && endAt > existingStart;
|
|
116
|
+
if (overlaps) {
|
|
117
|
+
throw new Error('Requested reservation time overlaps an existing reservation');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await state.adapter.query(`INSERT INTO booking_reservations (
|
|
121
|
+
reservation_id, listing_id, booker, start_at, end_at, amount, asset, note, status, created_at, updated_at
|
|
122
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [payload.reservationId, payload.listingId, booker, startAt, endAt, payment.amount, payment.asset, payload.note || '', 'pending', new Date(), new Date()]);
|
|
123
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'reserve', payload, {
|
|
124
|
+
action: 'booking_reserved',
|
|
125
|
+
data: {
|
|
126
|
+
listingId: payload.listingId,
|
|
127
|
+
reservationId: payload.reservationId,
|
|
128
|
+
booker,
|
|
129
|
+
startAt,
|
|
130
|
+
endAt
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
const confirmReservation = async (payload, ctx) => {
|
|
135
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
136
|
+
const reservations = await state.adapter.query('SELECT * FROM booking_reservations WHERE reservation_id = ?', [payload.reservationId]);
|
|
137
|
+
if (reservations.length === 0) {
|
|
138
|
+
throw new Error(`Reservation ${payload.reservationId} does not exist`);
|
|
139
|
+
}
|
|
140
|
+
const reservation = reservations[0];
|
|
141
|
+
const listings = await state.adapter.query('SELECT * FROM booking_listings WHERE listing_id = ?', [reservation.listing_id]);
|
|
142
|
+
if (listings.length === 0 || listings[0].owner !== owner) {
|
|
143
|
+
throw new Error('Only the listing owner can confirm reservations');
|
|
144
|
+
}
|
|
145
|
+
await state.adapter.query('UPDATE booking_reservations SET status = ?, updated_at = ? WHERE reservation_id = ?', ['confirmed', new Date(), payload.reservationId]);
|
|
146
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'confirmReservation', payload, {
|
|
147
|
+
action: 'booking_confirmed',
|
|
148
|
+
data: {
|
|
149
|
+
reservationId: payload.reservationId,
|
|
150
|
+
listingId: reservation.listing_id,
|
|
151
|
+
owner
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
const cancelReservation = async (payload, ctx) => {
|
|
156
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
157
|
+
const reservations = await state.adapter.query('SELECT * FROM booking_reservations WHERE reservation_id = ?', [payload.reservationId]);
|
|
158
|
+
if (reservations.length === 0) {
|
|
159
|
+
throw new Error(`Reservation ${payload.reservationId} does not exist`);
|
|
160
|
+
}
|
|
161
|
+
const reservation = reservations[0];
|
|
162
|
+
const listings = await state.adapter.query('SELECT * FROM booking_listings WHERE listing_id = ?', [reservation.listing_id]);
|
|
163
|
+
const listing = listings[0];
|
|
164
|
+
const isOwner = listing.owner === sender;
|
|
165
|
+
const isBooker = reservation.booker === sender;
|
|
166
|
+
if (!isOwner && !isBooker) {
|
|
167
|
+
throw new Error('Only the listing owner or booker can cancel this reservation');
|
|
168
|
+
}
|
|
169
|
+
if (isBooker) {
|
|
170
|
+
const cancellationWindowStart = new Date(((0, helpers_1.parseDateValue)(reservation.start_at) || new Date()).getTime() - Number(listing.cancellation_hours) * 60 * 60 * 1000);
|
|
171
|
+
if (cancellationWindowStart < new Date()) {
|
|
172
|
+
throw new Error('Cancellation window has passed');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
await state.adapter.query('UPDATE booking_reservations SET status = ?, updated_at = ? WHERE reservation_id = ?', ['cancelled', new Date(), payload.reservationId]);
|
|
176
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'cancelReservation', payload, {
|
|
177
|
+
action: 'booking_cancelled',
|
|
178
|
+
data: {
|
|
179
|
+
reservationId: payload.reservationId,
|
|
180
|
+
listingId: reservation.listing_id,
|
|
181
|
+
cancelledBy: sender,
|
|
182
|
+
reason: payload.reason || ''
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
const completeReservation = async (payload, ctx) => {
|
|
187
|
+
const reservations = await state.adapter.query('SELECT * FROM booking_reservations WHERE reservation_id = ?', [payload.reservationId]);
|
|
188
|
+
if (reservations.length === 0) {
|
|
189
|
+
throw new Error(`Reservation ${payload.reservationId} does not exist`);
|
|
190
|
+
}
|
|
191
|
+
const reservation = reservations[0];
|
|
192
|
+
if (ctx.trigger !== 'time') {
|
|
193
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
194
|
+
const listings = await state.adapter.query('SELECT * FROM booking_listings WHERE listing_id = ?', [reservation.listing_id]);
|
|
195
|
+
if (listings[0].owner !== sender) {
|
|
196
|
+
throw new Error('Only the listing owner can complete reservations');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
await state.adapter.query('UPDATE booking_reservations SET status = ?, updated_at = ? WHERE reservation_id = ?', ['completed', new Date(), payload.reservationId]);
|
|
200
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'completeReservation', payload, {
|
|
201
|
+
action: 'booking_completed',
|
|
202
|
+
data: {
|
|
203
|
+
reservationId: payload.reservationId,
|
|
204
|
+
listingId: reservation.listing_id
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
return (0, contract_1.defineContract)({
|
|
209
|
+
name,
|
|
210
|
+
hooks: {
|
|
211
|
+
create: async ({ adapter }) => {
|
|
212
|
+
state.adapter = adapter;
|
|
213
|
+
await initialize();
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
actions: {
|
|
217
|
+
createListing: (0, contract_1.action)(createListing, { schema: createListingSchema, trigger: 'custom_json' }),
|
|
218
|
+
reserve: (0, contract_1.action)(reserve, { schema: reserveSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
219
|
+
confirmReservation: (0, contract_1.action)(confirmReservation, { schema: reservationSchema, trigger: 'custom_json' }),
|
|
220
|
+
cancelReservation: (0, contract_1.action)(cancelReservation, { schema: reservationSchema, trigger: 'custom_json' }),
|
|
221
|
+
completeReservation: (0, contract_1.action)(completeReservation, { schema: reservationSchema, trigger: ['custom_json', 'time'] })
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=booking.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking.contract.js","sourceRoot":"","sources":["../../src/contracts/booking.contract.ts"],"names":[],"mappings":"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"}
|