hive-stream 3.0.2 → 3.0.4
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 +50 -2
- package/README.md +282 -4
- 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/builders.d.ts +176 -0
- package/dist/builders.js +727 -0
- package/dist/builders.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +95 -3
- 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 +25 -22
- 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 +25 -22
- 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 +66 -0
- package/dist/contracts/helpers.js +166 -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 +234 -195
- 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 +48 -20
- 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 +20 -0
- package/dist/metadata.js +320 -1
- package/dist/metadata.js.map +1 -1
- 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 +65 -4
- package/dist/streamer.js +768 -72
- package/dist/streamer.js.map +1 -1
- package/dist/types/hive-stream.d.ts +317 -0
- package/dist/utils.d.ts +33 -0
- package/dist/utils.js +198 -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/config-input.spec.ts +0 -90
- 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 -319
- package/tests/hive-rates.spec.ts +0 -443
- package/tests/integration/hive-rates.integration.spec.ts +0 -35
- package/tests/metadata.spec.ts +0 -63
- 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,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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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBountyBoardContract = createBountyBoardContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'bountyboard';
|
|
8
|
+
function createBountyBoardContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createBountySchema = zod_1.z.object({
|
|
12
|
+
bountyId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
description: zod_1.z.string().max(1200).optional(),
|
|
15
|
+
deadline: zod_1.z.string().optional(),
|
|
16
|
+
maxWinners: zod_1.z.number().int().min(1).max(25).optional(),
|
|
17
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
18
|
+
});
|
|
19
|
+
const submitWorkSchema = zod_1.z.object({
|
|
20
|
+
bountyId: helpers_1.identifierSchema,
|
|
21
|
+
submissionId: helpers_1.identifierSchema,
|
|
22
|
+
url: zod_1.z.string().url(),
|
|
23
|
+
description: zod_1.z.string().max(1000).optional()
|
|
24
|
+
});
|
|
25
|
+
const awardSchema = zod_1.z.object({
|
|
26
|
+
bountyId: helpers_1.identifierSchema,
|
|
27
|
+
submissionId: helpers_1.identifierSchema,
|
|
28
|
+
amount: helpers_1.amountSchema.optional(),
|
|
29
|
+
note: zod_1.z.string().max(280).optional()
|
|
30
|
+
});
|
|
31
|
+
const closeSchema = zod_1.z.object({
|
|
32
|
+
bountyId: helpers_1.identifierSchema
|
|
33
|
+
});
|
|
34
|
+
const initialize = async () => {
|
|
35
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
36
|
+
`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS bounty_board_bounties (
|
|
38
|
+
bounty_id TEXT PRIMARY KEY,
|
|
39
|
+
sponsor TEXT NOT NULL,
|
|
40
|
+
title TEXT NOT NULL,
|
|
41
|
+
description TEXT,
|
|
42
|
+
reward_pool TEXT NOT NULL,
|
|
43
|
+
remaining_reward TEXT NOT NULL,
|
|
44
|
+
asset TEXT NOT NULL,
|
|
45
|
+
deadline DATETIME,
|
|
46
|
+
max_winners INTEGER NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
metadata TEXT,
|
|
49
|
+
created_at DATETIME NOT NULL,
|
|
50
|
+
updated_at DATETIME NOT NULL
|
|
51
|
+
)
|
|
52
|
+
`,
|
|
53
|
+
`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS bounty_board_submissions (
|
|
55
|
+
submission_id TEXT PRIMARY KEY,
|
|
56
|
+
bounty_id TEXT NOT NULL,
|
|
57
|
+
submitter TEXT NOT NULL,
|
|
58
|
+
url TEXT NOT NULL,
|
|
59
|
+
description TEXT,
|
|
60
|
+
status TEXT NOT NULL,
|
|
61
|
+
created_at DATETIME NOT NULL
|
|
62
|
+
)
|
|
63
|
+
`,
|
|
64
|
+
`
|
|
65
|
+
CREATE TABLE IF NOT EXISTS bounty_board_awards (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
bounty_id TEXT NOT NULL,
|
|
68
|
+
submission_id TEXT NOT NULL,
|
|
69
|
+
winner TEXT NOT NULL,
|
|
70
|
+
amount TEXT NOT NULL,
|
|
71
|
+
note TEXT,
|
|
72
|
+
created_at DATETIME NOT NULL
|
|
73
|
+
)
|
|
74
|
+
`
|
|
75
|
+
]);
|
|
76
|
+
};
|
|
77
|
+
const createBounty = async (payload, ctx) => {
|
|
78
|
+
const sponsor = (0, helpers_1.requireSender)(ctx);
|
|
79
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
80
|
+
const existing = await state.adapter.query('SELECT bounty_id FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
|
|
81
|
+
if (existing.length > 0) {
|
|
82
|
+
throw new Error(`Bounty ${payload.bountyId} already exists`);
|
|
83
|
+
}
|
|
84
|
+
const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
|
|
85
|
+
if (deadline && deadline <= new Date()) {
|
|
86
|
+
throw new Error('Bounty deadline must be in the future');
|
|
87
|
+
}
|
|
88
|
+
await state.adapter.query(`INSERT INTO bounty_board_bounties (
|
|
89
|
+
bounty_id, sponsor, title, description, reward_pool, remaining_reward, asset, deadline, max_winners, status, metadata, created_at, updated_at
|
|
90
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
91
|
+
payload.bountyId,
|
|
92
|
+
sponsor,
|
|
93
|
+
payload.title,
|
|
94
|
+
payload.description || '',
|
|
95
|
+
payment.amount,
|
|
96
|
+
payment.amount,
|
|
97
|
+
payment.asset,
|
|
98
|
+
deadline,
|
|
99
|
+
payload.maxWinners || 1,
|
|
100
|
+
'open',
|
|
101
|
+
JSON.stringify(payload.metadata || {}),
|
|
102
|
+
new Date(),
|
|
103
|
+
new Date()
|
|
104
|
+
]);
|
|
105
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createBounty', payload, {
|
|
106
|
+
action: 'bounty_created',
|
|
107
|
+
data: {
|
|
108
|
+
bountyId: payload.bountyId,
|
|
109
|
+
sponsor,
|
|
110
|
+
rewardPool: payment.amount,
|
|
111
|
+
asset: payment.asset
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const submitWork = async (payload, ctx) => {
|
|
116
|
+
const submitter = (0, helpers_1.requireSender)(ctx);
|
|
117
|
+
const bounties = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
|
|
118
|
+
if (bounties.length === 0) {
|
|
119
|
+
throw new Error(`Bounty ${payload.bountyId} does not exist`);
|
|
120
|
+
}
|
|
121
|
+
const bounty = bounties[0];
|
|
122
|
+
if (bounty.status !== 'open' && bounty.status !== 'partially_awarded') {
|
|
123
|
+
throw new Error('Bounty is not accepting submissions');
|
|
124
|
+
}
|
|
125
|
+
const deadline = (0, helpers_1.parseDateValue)(bounty.deadline);
|
|
126
|
+
if (deadline && deadline <= new Date()) {
|
|
127
|
+
throw new Error('Bounty submission window has closed');
|
|
128
|
+
}
|
|
129
|
+
const existing = await state.adapter.query('SELECT submission_id FROM bounty_board_submissions WHERE submission_id = ?', [payload.submissionId]);
|
|
130
|
+
if (existing.length > 0) {
|
|
131
|
+
throw new Error(`Submission ${payload.submissionId} already exists`);
|
|
132
|
+
}
|
|
133
|
+
await state.adapter.query(`INSERT INTO bounty_board_submissions (
|
|
134
|
+
submission_id, bounty_id, submitter, url, description, status, created_at
|
|
135
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)`, [payload.submissionId, payload.bountyId, submitter, payload.url, payload.description || '', 'submitted', new Date()]);
|
|
136
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'submitWork', payload, {
|
|
137
|
+
action: 'bounty_submission_received',
|
|
138
|
+
data: {
|
|
139
|
+
bountyId: payload.bountyId,
|
|
140
|
+
submissionId: payload.submissionId,
|
|
141
|
+
submitter
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
const awardBounty = async (payload, ctx) => {
|
|
146
|
+
const sponsor = (0, helpers_1.requireSender)(ctx);
|
|
147
|
+
const bountyRows = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
|
|
148
|
+
if (bountyRows.length === 0) {
|
|
149
|
+
throw new Error(`Bounty ${payload.bountyId} does not exist`);
|
|
150
|
+
}
|
|
151
|
+
const bounty = bountyRows[0];
|
|
152
|
+
if (bounty.sponsor !== sponsor) {
|
|
153
|
+
throw new Error('Only the bounty sponsor can award submissions');
|
|
154
|
+
}
|
|
155
|
+
if (bounty.status === 'closed') {
|
|
156
|
+
throw new Error('Bounty is closed');
|
|
157
|
+
}
|
|
158
|
+
const submissions = await state.adapter.query('SELECT * FROM bounty_board_submissions WHERE submission_id = ? AND bounty_id = ?', [payload.submissionId, payload.bountyId]);
|
|
159
|
+
if (submissions.length === 0) {
|
|
160
|
+
throw new Error('Submission does not exist for this bounty');
|
|
161
|
+
}
|
|
162
|
+
const submission = submissions[0];
|
|
163
|
+
if (submission.status === 'awarded') {
|
|
164
|
+
throw new Error('Submission already awarded');
|
|
165
|
+
}
|
|
166
|
+
const amount = payload.amount || bounty.remaining_reward;
|
|
167
|
+
if ((0, helpers_1.toBigNumber)(amount).gt(bounty.remaining_reward)) {
|
|
168
|
+
throw new Error('Award amount exceeds remaining bounty reward');
|
|
169
|
+
}
|
|
170
|
+
const awardCountRows = await state.adapter.query('SELECT COUNT(*) AS count FROM bounty_board_awards WHERE bounty_id = ?', [payload.bountyId]);
|
|
171
|
+
const awardCount = Number(awardCountRows[0]?.count || 0);
|
|
172
|
+
if (awardCount >= Number(bounty.max_winners)) {
|
|
173
|
+
throw new Error('Maximum winners already reached');
|
|
174
|
+
}
|
|
175
|
+
await state.adapter.query('INSERT INTO bounty_board_awards (bounty_id, submission_id, winner, amount, note, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.bountyId, payload.submissionId, submission.submitter, amount, payload.note || '', new Date()]);
|
|
176
|
+
await state.adapter.query('UPDATE bounty_board_submissions SET status = ? WHERE submission_id = ?', ['awarded', payload.submissionId]);
|
|
177
|
+
const remainingReward = (0, helpers_1.toBigNumber)(bounty.remaining_reward).minus(amount);
|
|
178
|
+
const nextStatus = remainingReward.lte(0) || awardCount + 1 >= Number(bounty.max_winners)
|
|
179
|
+
? 'closed'
|
|
180
|
+
: 'partially_awarded';
|
|
181
|
+
await state.adapter.query('UPDATE bounty_board_bounties SET remaining_reward = ?, status = ?, updated_at = ? WHERE bounty_id = ?', [remainingReward.toFixed(), nextStatus, new Date(), payload.bountyId]);
|
|
182
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'awardBounty', payload, {
|
|
183
|
+
action: 'bounty_awarded',
|
|
184
|
+
data: {
|
|
185
|
+
bountyId: payload.bountyId,
|
|
186
|
+
submissionId: payload.submissionId,
|
|
187
|
+
winner: submission.submitter,
|
|
188
|
+
amount,
|
|
189
|
+
asset: bounty.asset,
|
|
190
|
+
remainingReward: remainingReward.toFixed()
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
const closeBounty = async (payload, ctx) => {
|
|
195
|
+
const bountyRows = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
|
|
196
|
+
if (bountyRows.length === 0) {
|
|
197
|
+
throw new Error(`Bounty ${payload.bountyId} does not exist`);
|
|
198
|
+
}
|
|
199
|
+
const bounty = bountyRows[0];
|
|
200
|
+
if (ctx.trigger !== 'time') {
|
|
201
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
202
|
+
if (sender !== bounty.sponsor) {
|
|
203
|
+
throw new Error('Only the bounty sponsor can close this bounty');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
await state.adapter.query('UPDATE bounty_board_bounties SET status = ?, updated_at = ? WHERE bounty_id = ?', ['closed', new Date(), payload.bountyId]);
|
|
207
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeBounty', payload, {
|
|
208
|
+
action: 'bounty_closed',
|
|
209
|
+
data: {
|
|
210
|
+
bountyId: payload.bountyId,
|
|
211
|
+
sponsor: bounty.sponsor,
|
|
212
|
+
remainingReward: bounty.remaining_reward,
|
|
213
|
+
asset: bounty.asset
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
return (0, contract_1.defineContract)({
|
|
218
|
+
name,
|
|
219
|
+
hooks: {
|
|
220
|
+
create: async ({ adapter }) => {
|
|
221
|
+
state.adapter = adapter;
|
|
222
|
+
await initialize();
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
actions: {
|
|
226
|
+
createBounty: (0, contract_1.action)(createBounty, { schema: createBountySchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
227
|
+
submitWork: (0, contract_1.action)(submitWork, { schema: submitWorkSchema, trigger: 'custom_json' }),
|
|
228
|
+
awardBounty: (0, contract_1.action)(awardBounty, { schema: awardSchema, trigger: 'custom_json' }),
|
|
229
|
+
closeBounty: (0, contract_1.action)(closeBounty, { schema: closeSchema, trigger: ['custom_json', 'time'] })
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=bountyboard.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bountyboard.contract.js","sourceRoot":"","sources":["../../src/contracts/bountyboard.contract.ts"],"names":[],"mappings":"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"}
|