hive-stream 3.0.2 → 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 +50 -2
- package/README.md +44 -3
- 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 +7 -1
- package/dist/config.js +7 -1
- 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 +39 -0
- package/dist/index.js +71 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +7 -0
- package/dist/metadata.js +64 -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 +21 -1
- package/dist/streamer.js +187 -62
- 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/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,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRevenueSplitContract = createRevenueSplitContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'revenuesplit';
|
|
8
|
+
function createRevenueSplitContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const recipientSchema = zod_1.z.object({
|
|
12
|
+
account: zod_1.z.string().min(3).max(32),
|
|
13
|
+
bps: zod_1.z.number().int().min(1).max(10000)
|
|
14
|
+
});
|
|
15
|
+
const createSplitSchema = zod_1.z.object({
|
|
16
|
+
splitId: helpers_1.identifierSchema,
|
|
17
|
+
title: zod_1.z.string().min(3).max(140),
|
|
18
|
+
recipients: zod_1.z.array(recipientSchema).min(1).max(25),
|
|
19
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
20
|
+
});
|
|
21
|
+
const splitIdSchema = zod_1.z.object({
|
|
22
|
+
splitId: helpers_1.identifierSchema
|
|
23
|
+
});
|
|
24
|
+
const updateSplitSchema = zod_1.z.object({
|
|
25
|
+
splitId: helpers_1.identifierSchema,
|
|
26
|
+
recipients: zod_1.z.array(recipientSchema).min(1).max(25),
|
|
27
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
28
|
+
});
|
|
29
|
+
const withdrawSchema = zod_1.z.object({
|
|
30
|
+
splitId: helpers_1.identifierSchema.optional(),
|
|
31
|
+
asset: zod_1.z.string().min(3).max(16).optional()
|
|
32
|
+
}).optional();
|
|
33
|
+
const initialize = async () => {
|
|
34
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
35
|
+
`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS revenue_splits (
|
|
37
|
+
split_id TEXT PRIMARY KEY,
|
|
38
|
+
owner TEXT NOT NULL,
|
|
39
|
+
title TEXT NOT NULL,
|
|
40
|
+
recipients_json TEXT NOT NULL,
|
|
41
|
+
active INTEGER NOT NULL,
|
|
42
|
+
metadata TEXT,
|
|
43
|
+
created_at DATETIME NOT NULL,
|
|
44
|
+
updated_at DATETIME NOT NULL
|
|
45
|
+
)
|
|
46
|
+
`,
|
|
47
|
+
`
|
|
48
|
+
CREATE TABLE IF NOT EXISTS revenue_split_balances (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
split_id TEXT NOT NULL,
|
|
51
|
+
account TEXT NOT NULL,
|
|
52
|
+
asset TEXT NOT NULL,
|
|
53
|
+
balance TEXT NOT NULL,
|
|
54
|
+
updated_at DATETIME NOT NULL,
|
|
55
|
+
UNIQUE(split_id, account, asset)
|
|
56
|
+
)
|
|
57
|
+
`,
|
|
58
|
+
`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS revenue_split_distributions (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
split_id TEXT NOT NULL,
|
|
62
|
+
amount TEXT NOT NULL,
|
|
63
|
+
asset TEXT NOT NULL,
|
|
64
|
+
payer TEXT NOT NULL,
|
|
65
|
+
reference TEXT,
|
|
66
|
+
created_at DATETIME NOT NULL
|
|
67
|
+
)
|
|
68
|
+
`
|
|
69
|
+
]);
|
|
70
|
+
};
|
|
71
|
+
const validateRecipients = (owner, recipients) => {
|
|
72
|
+
const accounts = (0, helpers_1.uniqueItems)(recipients.map(recipient => recipient.account));
|
|
73
|
+
if (accounts.length !== recipients.length) {
|
|
74
|
+
throw new Error('Recipient accounts must be unique');
|
|
75
|
+
}
|
|
76
|
+
if (!accounts.includes(owner)) {
|
|
77
|
+
accounts.push(owner);
|
|
78
|
+
}
|
|
79
|
+
const totalBps = recipients.reduce((sum, recipient) => sum + recipient.bps, 0);
|
|
80
|
+
if (totalBps !== 10000) {
|
|
81
|
+
throw new Error('Recipient basis points must total 10000');
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const createSplit = async (payload, ctx) => {
|
|
85
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
86
|
+
validateRecipients(owner, payload.recipients);
|
|
87
|
+
const existing = await state.adapter.query('SELECT split_id FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
88
|
+
if (existing.length > 0) {
|
|
89
|
+
throw new Error(`Split ${payload.splitId} already exists`);
|
|
90
|
+
}
|
|
91
|
+
await state.adapter.query(`INSERT INTO revenue_splits (
|
|
92
|
+
split_id, owner, title, recipients_json, active, metadata, created_at, updated_at
|
|
93
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
94
|
+
payload.splitId,
|
|
95
|
+
owner,
|
|
96
|
+
payload.title,
|
|
97
|
+
JSON.stringify(payload.recipients),
|
|
98
|
+
1,
|
|
99
|
+
JSON.stringify(payload.metadata || {}),
|
|
100
|
+
new Date(),
|
|
101
|
+
new Date()
|
|
102
|
+
]);
|
|
103
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createSplit', payload, {
|
|
104
|
+
action: 'revenue_split_created',
|
|
105
|
+
data: {
|
|
106
|
+
splitId: payload.splitId,
|
|
107
|
+
owner
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const updateSplit = async (payload, ctx) => {
|
|
112
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
113
|
+
const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
114
|
+
if (rows.length === 0) {
|
|
115
|
+
throw new Error(`Split ${payload.splitId} does not exist`);
|
|
116
|
+
}
|
|
117
|
+
const split = rows[0];
|
|
118
|
+
if (split.owner !== owner) {
|
|
119
|
+
throw new Error('Only the split owner can update recipients');
|
|
120
|
+
}
|
|
121
|
+
validateRecipients(owner, payload.recipients);
|
|
122
|
+
await state.adapter.query('UPDATE revenue_splits SET recipients_json = ?, metadata = ?, updated_at = ? WHERE split_id = ?', [JSON.stringify(payload.recipients), JSON.stringify(payload.metadata || (0, helpers_1.parseJson)(split.metadata, {})), new Date(), payload.splitId]);
|
|
123
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'updateSplit', payload, {
|
|
124
|
+
action: 'revenue_split_updated',
|
|
125
|
+
data: {
|
|
126
|
+
splitId: payload.splitId,
|
|
127
|
+
owner
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const distribute = async (payload, ctx) => {
|
|
132
|
+
const payer = (0, helpers_1.requireSender)(ctx);
|
|
133
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
134
|
+
const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
135
|
+
if (rows.length === 0) {
|
|
136
|
+
throw new Error(`Split ${payload.splitId} does not exist`);
|
|
137
|
+
}
|
|
138
|
+
const split = rows[0];
|
|
139
|
+
if (!split.active) {
|
|
140
|
+
throw new Error('Revenue split is not active');
|
|
141
|
+
}
|
|
142
|
+
const recipients = (0, helpers_1.parseJson)(split.recipients_json, []);
|
|
143
|
+
let allocated = (0, helpers_1.toBigNumber)(0);
|
|
144
|
+
for (let index = 0; index < recipients.length; index++) {
|
|
145
|
+
const recipient = recipients[index];
|
|
146
|
+
const share = index === recipients.length - 1
|
|
147
|
+
? (0, helpers_1.toBigNumber)(payment.amount).minus(allocated)
|
|
148
|
+
: (0, helpers_1.toBigNumber)(payment.amount).multipliedBy(recipient.bps).dividedBy(10000).decimalPlaces(8, 1);
|
|
149
|
+
allocated = allocated.plus(share);
|
|
150
|
+
const balanceRows = await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ? AND asset = ?', [payload.splitId, recipient.account, payment.asset]);
|
|
151
|
+
const currentBalance = balanceRows.length > 0 ? (0, helpers_1.toBigNumber)(balanceRows[0].balance) : (0, helpers_1.toBigNumber)(0);
|
|
152
|
+
const nextBalance = currentBalance.plus(share);
|
|
153
|
+
await state.adapter.query(`INSERT INTO revenue_split_balances (split_id, account, asset, balance, updated_at)
|
|
154
|
+
VALUES (?, ?, ?, ?, ?)
|
|
155
|
+
ON CONFLICT(split_id, account, asset)
|
|
156
|
+
DO UPDATE SET balance = excluded.balance, updated_at = excluded.updated_at`, [payload.splitId, recipient.account, payment.asset, nextBalance.toFixed(), new Date()]);
|
|
157
|
+
}
|
|
158
|
+
await state.adapter.query('INSERT INTO revenue_split_distributions (split_id, amount, asset, payer, reference, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.splitId, payment.amount, payment.asset, payer, payment.memo || '', new Date()]);
|
|
159
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'distribute', payload, {
|
|
160
|
+
action: 'revenue_split_distributed',
|
|
161
|
+
data: {
|
|
162
|
+
splitId: payload.splitId,
|
|
163
|
+
payer,
|
|
164
|
+
amount: payment.amount,
|
|
165
|
+
asset: payment.asset,
|
|
166
|
+
recipients
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
const withdraw = async (payload = {}, ctx) => {
|
|
171
|
+
const account = (0, helpers_1.requireSender)(ctx);
|
|
172
|
+
const balances = payload.splitId
|
|
173
|
+
? await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ?', [payload.splitId, account])
|
|
174
|
+
: await state.adapter.query('SELECT * FROM revenue_split_balances WHERE account = ?', [account]);
|
|
175
|
+
const filtered = balances.filter((balance) => !payload.asset || balance.asset === payload.asset);
|
|
176
|
+
if (filtered.length === 0) {
|
|
177
|
+
throw new Error('No withdrawable revenue split balances found');
|
|
178
|
+
}
|
|
179
|
+
for (const balance of filtered) {
|
|
180
|
+
if ((0, helpers_1.toBigNumber)(balance.balance).lte(0)) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
await state.adapter.query('UPDATE revenue_split_balances SET balance = ?, updated_at = ? WHERE split_id = ? AND account = ? AND asset = ?', ['0', new Date(), balance.split_id, account, balance.asset]);
|
|
184
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
|
|
185
|
+
action: 'revenue_split_withdrawal_requested',
|
|
186
|
+
data: {
|
|
187
|
+
splitId: balance.split_id,
|
|
188
|
+
account,
|
|
189
|
+
amount: balance.balance,
|
|
190
|
+
asset: balance.asset
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
return (0, contract_1.defineContract)({
|
|
196
|
+
name,
|
|
197
|
+
hooks: {
|
|
198
|
+
create: async ({ adapter }) => {
|
|
199
|
+
state.adapter = adapter;
|
|
200
|
+
await initialize();
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
actions: {
|
|
204
|
+
createSplit: (0, contract_1.action)(createSplit, { schema: createSplitSchema, trigger: 'custom_json' }),
|
|
205
|
+
updateSplit: (0, contract_1.action)(updateSplit, { schema: updateSplitSchema, trigger: 'custom_json' }),
|
|
206
|
+
distribute: (0, contract_1.action)(distribute, { schema: splitIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
207
|
+
withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' })
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=revenuesplit.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revenuesplit.contract.js","sourceRoot":"","sources":["../../src/contracts/revenuesplit.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -136,6 +136,7 @@ function createRpsContract(options = {}) {
|
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
138
|
state.pendingPayouts = state.pendingPayouts.plus(potentialPayout);
|
|
139
|
+
let payoutIncremented = true;
|
|
139
140
|
try {
|
|
140
141
|
const serverSeed = (0, uuid_1.v4)();
|
|
141
142
|
const serverMove = rng(ctx.block.previousId, ctx.block.id, ctx.transaction.id, serverSeed, payload.seed ?? '');
|
|
@@ -160,6 +161,8 @@ function createRpsContract(options = {}) {
|
|
|
160
161
|
});
|
|
161
162
|
if (result === 'win') {
|
|
162
163
|
await state.streamer.transferHiveTokens(account, sender, potentialPayout.toFixed(3), amountTrim[1], `[Winner] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
|
|
164
|
+
// Invalidate balance cache after payout
|
|
165
|
+
state.balanceCache = null;
|
|
163
166
|
}
|
|
164
167
|
else if (result === 'tie') {
|
|
165
168
|
await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], `[Tie] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
|
|
@@ -169,7 +172,10 @@ function createRpsContract(options = {}) {
|
|
|
169
172
|
}
|
|
170
173
|
}
|
|
171
174
|
finally {
|
|
172
|
-
|
|
175
|
+
if (payoutIncremented) {
|
|
176
|
+
state.pendingPayouts = state.pendingPayouts.minus(potentialPayout);
|
|
177
|
+
payoutIncremented = false;
|
|
178
|
+
}
|
|
173
179
|
}
|
|
174
180
|
}
|
|
175
181
|
}
|
|
@@ -181,6 +187,16 @@ function createRpsContract(options = {}) {
|
|
|
181
187
|
payload,
|
|
182
188
|
message: error.message
|
|
183
189
|
});
|
|
190
|
+
// Attempt refund on unexpected errors to avoid loss of funds
|
|
191
|
+
try {
|
|
192
|
+
if (amountRaw && typeof amountRaw === 'string' && amountRaw.includes(' ')) {
|
|
193
|
+
const parts = amountRaw.split(' ');
|
|
194
|
+
await state.streamer.transferHiveTokens(account, sender, parts[0], parts[1], '[Refund] An error occurred processing your bet.');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (refundError) {
|
|
198
|
+
console.error('[RpsContract] Refund failed:', refundError);
|
|
199
|
+
}
|
|
184
200
|
throw error;
|
|
185
201
|
}
|
|
186
202
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":";;;;;AAkCA,
|
|
1
|
+
{"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSavingsContract = createSavingsContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'savings';
|
|
8
|
+
function createSavingsContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createGoalSchema = zod_1.z.object({
|
|
12
|
+
goalId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
targetAmount: helpers_1.amountSchema,
|
|
15
|
+
asset: helpers_1.assetSchema,
|
|
16
|
+
deadline: zod_1.z.string().optional(),
|
|
17
|
+
allowEarlyWithdraw: zod_1.z.boolean().optional(),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const goalIdSchema = zod_1.z.object({
|
|
21
|
+
goalId: helpers_1.identifierSchema
|
|
22
|
+
});
|
|
23
|
+
const withdrawSchema = zod_1.z.object({
|
|
24
|
+
goalId: helpers_1.identifierSchema,
|
|
25
|
+
amount: helpers_1.amountSchema.optional(),
|
|
26
|
+
note: zod_1.z.string().max(280).optional()
|
|
27
|
+
});
|
|
28
|
+
const initialize = async () => {
|
|
29
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
30
|
+
`
|
|
31
|
+
CREATE TABLE IF NOT EXISTS savings_goals (
|
|
32
|
+
goal_id TEXT PRIMARY KEY,
|
|
33
|
+
owner TEXT NOT NULL,
|
|
34
|
+
title TEXT NOT NULL,
|
|
35
|
+
target_amount TEXT NOT NULL,
|
|
36
|
+
current_amount TEXT NOT NULL,
|
|
37
|
+
asset TEXT NOT NULL,
|
|
38
|
+
deadline DATETIME,
|
|
39
|
+
allow_early_withdraw INTEGER NOT NULL,
|
|
40
|
+
status TEXT NOT NULL,
|
|
41
|
+
metadata TEXT,
|
|
42
|
+
created_at DATETIME NOT NULL,
|
|
43
|
+
updated_at DATETIME NOT NULL
|
|
44
|
+
)
|
|
45
|
+
`,
|
|
46
|
+
`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS savings_contributions (
|
|
48
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
49
|
+
goal_id TEXT NOT NULL,
|
|
50
|
+
contributor TEXT NOT NULL,
|
|
51
|
+
amount TEXT NOT NULL,
|
|
52
|
+
asset TEXT NOT NULL,
|
|
53
|
+
source TEXT NOT NULL,
|
|
54
|
+
transaction_id TEXT NOT NULL,
|
|
55
|
+
created_at DATETIME NOT NULL
|
|
56
|
+
)
|
|
57
|
+
`,
|
|
58
|
+
`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS savings_withdrawals (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
goal_id TEXT NOT NULL,
|
|
62
|
+
owner TEXT NOT NULL,
|
|
63
|
+
amount TEXT NOT NULL,
|
|
64
|
+
note TEXT,
|
|
65
|
+
created_at DATETIME NOT NULL
|
|
66
|
+
)
|
|
67
|
+
`
|
|
68
|
+
]);
|
|
69
|
+
};
|
|
70
|
+
const createGoal = async (payload, ctx) => {
|
|
71
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
72
|
+
const existing = await state.adapter.query('SELECT goal_id FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
73
|
+
if (existing.length > 0) {
|
|
74
|
+
throw new Error(`Goal ${payload.goalId} already exists`);
|
|
75
|
+
}
|
|
76
|
+
const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
|
|
77
|
+
if (deadline && deadline <= new Date()) {
|
|
78
|
+
throw new Error('Goal deadline must be in the future');
|
|
79
|
+
}
|
|
80
|
+
await state.adapter.query(`INSERT INTO savings_goals (
|
|
81
|
+
goal_id, owner, title, target_amount, current_amount, asset, deadline, allow_early_withdraw, status, metadata, created_at, updated_at
|
|
82
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
83
|
+
payload.goalId,
|
|
84
|
+
owner,
|
|
85
|
+
payload.title,
|
|
86
|
+
payload.targetAmount,
|
|
87
|
+
'0',
|
|
88
|
+
payload.asset,
|
|
89
|
+
deadline,
|
|
90
|
+
payload.allowEarlyWithdraw ? 1 : 0,
|
|
91
|
+
'open',
|
|
92
|
+
JSON.stringify(payload.metadata || {}),
|
|
93
|
+
new Date(),
|
|
94
|
+
new Date()
|
|
95
|
+
]);
|
|
96
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createGoal', payload, {
|
|
97
|
+
action: 'savings_goal_created',
|
|
98
|
+
data: {
|
|
99
|
+
goalId: payload.goalId,
|
|
100
|
+
owner
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const contribute = async (payload, ctx) => {
|
|
105
|
+
const contributor = (0, helpers_1.requireSender)(ctx);
|
|
106
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
107
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
108
|
+
if (goals.length === 0) {
|
|
109
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
110
|
+
}
|
|
111
|
+
const goal = goals[0];
|
|
112
|
+
if (goal.status !== 'open' && goal.status !== 'funded') {
|
|
113
|
+
throw new Error('Goal is not accepting contributions');
|
|
114
|
+
}
|
|
115
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, goal.asset);
|
|
116
|
+
const currentAmount = (0, helpers_1.toBigNumber)(goal.current_amount).plus(payment.amount);
|
|
117
|
+
const status = currentAmount.gte(goal.target_amount)
|
|
118
|
+
? 'funded'
|
|
119
|
+
: goal.status;
|
|
120
|
+
await state.adapter.query('INSERT INTO savings_contributions (goal_id, contributor, amount, asset, source, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [payload.goalId, contributor, payment.amount, payment.asset, payment.source, ctx.transaction.id, new Date()]);
|
|
121
|
+
await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [currentAmount.toFixed(), status, new Date(), payload.goalId]);
|
|
122
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'contribute', payload, {
|
|
123
|
+
action: 'savings_contribution_received',
|
|
124
|
+
data: {
|
|
125
|
+
goalId: payload.goalId,
|
|
126
|
+
contributor,
|
|
127
|
+
amount: payment.amount,
|
|
128
|
+
asset: payment.asset,
|
|
129
|
+
currentAmount: currentAmount.toFixed(),
|
|
130
|
+
status
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
const withdraw = async (payload, ctx) => {
|
|
135
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
136
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
137
|
+
if (goals.length === 0) {
|
|
138
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
139
|
+
}
|
|
140
|
+
const goal = goals[0];
|
|
141
|
+
if (goal.owner !== owner) {
|
|
142
|
+
throw new Error('Only the goal owner can withdraw funds');
|
|
143
|
+
}
|
|
144
|
+
const goalMet = (0, helpers_1.toBigNumber)(goal.current_amount).gte(goal.target_amount);
|
|
145
|
+
if (!goalMet && !goal.allow_early_withdraw) {
|
|
146
|
+
throw new Error('Goal has not been met and early withdrawals are disabled');
|
|
147
|
+
}
|
|
148
|
+
const amount = payload.amount || goal.current_amount;
|
|
149
|
+
if ((0, helpers_1.toBigNumber)(amount).gt(goal.current_amount)) {
|
|
150
|
+
throw new Error('Withdrawal amount exceeds available goal balance');
|
|
151
|
+
}
|
|
152
|
+
const remaining = (0, helpers_1.toBigNumber)(goal.current_amount).minus(amount);
|
|
153
|
+
const nextStatus = remaining.eq(0)
|
|
154
|
+
? 'withdrawn'
|
|
155
|
+
: goal.status;
|
|
156
|
+
await state.adapter.query('INSERT INTO savings_withdrawals (goal_id, owner, amount, note, created_at) VALUES (?, ?, ?, ?, ?)', [payload.goalId, owner, amount, payload.note || '', new Date()]);
|
|
157
|
+
await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [remaining.toFixed(), nextStatus, new Date(), payload.goalId]);
|
|
158
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
|
|
159
|
+
action: 'savings_withdrawal_requested',
|
|
160
|
+
data: {
|
|
161
|
+
goalId: payload.goalId,
|
|
162
|
+
owner,
|
|
163
|
+
amount,
|
|
164
|
+
asset: goal.asset,
|
|
165
|
+
remainingAmount: remaining.toFixed()
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
const closeGoal = async (payload, ctx) => {
|
|
170
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
171
|
+
if (goals.length === 0) {
|
|
172
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
173
|
+
}
|
|
174
|
+
const goal = goals[0];
|
|
175
|
+
if (ctx.trigger !== 'time') {
|
|
176
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
177
|
+
if (sender !== goal.owner) {
|
|
178
|
+
throw new Error('Only the goal owner can close this goal');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
await state.adapter.query('UPDATE savings_goals SET status = ?, updated_at = ? WHERE goal_id = ?', ['closed', new Date(), payload.goalId]);
|
|
182
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeGoal', payload, {
|
|
183
|
+
action: 'savings_goal_closed',
|
|
184
|
+
data: {
|
|
185
|
+
goalId: payload.goalId,
|
|
186
|
+
owner: goal.owner,
|
|
187
|
+
currentAmount: goal.current_amount,
|
|
188
|
+
asset: goal.asset
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
return (0, contract_1.defineContract)({
|
|
193
|
+
name,
|
|
194
|
+
hooks: {
|
|
195
|
+
create: async ({ adapter }) => {
|
|
196
|
+
state.adapter = adapter;
|
|
197
|
+
await initialize();
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
actions: {
|
|
201
|
+
createGoal: (0, contract_1.action)(createGoal, { schema: createGoalSchema, trigger: 'custom_json' }),
|
|
202
|
+
contribute: (0, contract_1.action)(contribute, { schema: goalIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
203
|
+
withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' }),
|
|
204
|
+
closeGoal: (0, contract_1.action)(closeGoal, { schema: goalIdSchema, trigger: ['custom_json', 'time'] })
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=savings.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.contract.js","sourceRoot":"","sources":["../../src/contracts/savings.contract.ts"],"names":[],"mappings":";;AAsBA,sDAmPC;AAzQD,6BAAwB;AACxB,yCAAoD;AACpD,uCAYmB;AAEnB,MAAM,YAAY,GAAG,SAAS,CAAC;AAM/B,SAAgB,qBAAqB,CAAC,UAAkC,EAAE;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,6BAAmB,GAAE,CAAC;IAEpC,MAAM,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC9B,MAAM,EAAE,0BAAgB;QACxB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,YAAY,EAAE,sBAAY;QAC1B,KAAK,EAAE,qBAAW;QAClB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,kBAAkB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC1C,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,0BAAgB;KAC3B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,0BAAgB;QACxB,MAAM,EAAE,sBAAY,CAAC,QAAQ,EAAE;QAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE;YAClC;;;;;;;;;;;;;;;aAeC;YACD;;;;;;;;;;;aAWC;YACD;;;;;;;;;aASC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAAyC,EAAE,GAAQ,EAAE,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACpH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,wBAAc,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;0DAE8C,EAC9C;YACI,OAAO,CAAC,MAAM;YACd,KAAK;YACL,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,YAAY;YACpB,GAAG;YACH,OAAO,CAAC,KAAK;YACb,QAAQ;YACR,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM;YACN,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE;YACV,IAAI,IAAI,EAAE;SACb,CACJ,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE;gBACF,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAAqC,EAAE,GAAQ,EAAE,EAAE;QACzE,MAAM,WAAW,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAA,4BAAkB,EAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;YAChD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAElB,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,0IAA0I,EAC1I,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAC/G,CAAC;QAEF,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,2FAA2F,EAC3F,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAChE,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,+BAA+B;YACvC,IAAI,EAAE;gBACF,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW;gBACX,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE;gBACtC,MAAM;aACT;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAuC,EAAE,GAAQ,EAAE,EAAE;QACzE,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;QACrD,IAAI,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAElB,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,mGAAmG,EACnG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAClE,CAAC;QACF,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,2FAA2F,EAC3F,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAChE,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;YAC9D,MAAM,EAAE,8BAA8B;YACtC,IAAI,EAAE;gBACF,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK;gBACL,MAAM;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,eAAe,EAAE,SAAS,CAAC,OAAO,EAAE;aACvC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,OAAqC,EAAE,GAAQ,EAAE,EAAE;QACxE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,uEAAuE,EACvE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CACzC,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;YAC/D,MAAM,EAAE,qBAAqB;YAC7B,IAAI,EAAE;gBACF,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,IAAI,CAAC,cAAc;gBAClC,KAAK,EAAE,IAAI,CAAC,KAAK;aACpB;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,IAAA,yBAAc,EAAC;QAClB,IAAI;QACJ,KAAK,EAAE;YACH,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBACxB,MAAM,UAAU,EAAE,CAAC;YACvB,CAAC;SACJ;QACD,OAAO,EAAE;YACL,UAAU,EAAE,IAAA,iBAAM,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpF,UAAU,EAAE,IAAA,iBAAM,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACrG,QAAQ,EAAE,IAAA,iBAAM,EAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YAC9E,SAAS,EAAE,IAAA,iBAAM,EAAC,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;SAC3F;KACJ,CAAC,CAAC;AACP,CAAC"}
|