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
|
@@ -8,6 +8,7 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
|
8
8
|
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
9
9
|
const zod_1 = require("zod");
|
|
10
10
|
const contract_1 = require("./contract");
|
|
11
|
+
const helpers_1 = require("./helpers");
|
|
11
12
|
const DEFAULT_NAME = 'hivedice';
|
|
12
13
|
const DEFAULT_ACCOUNT = 'beggars';
|
|
13
14
|
const DEFAULT_TOKEN_SYMBOL = 'HIVE';
|
|
@@ -54,11 +55,7 @@ function createDiceContract(options = {}) {
|
|
|
54
55
|
try {
|
|
55
56
|
const accountInfo = await state.streamer['client'].database.getAccounts([account]);
|
|
56
57
|
if (accountInfo?.[0]) {
|
|
57
|
-
const
|
|
58
|
-
const amount = new bignumber_js_1.default(balanceParts[0]);
|
|
59
|
-
if (amount.isNaN() || !amount.isFinite()) {
|
|
60
|
-
throw new Error('Invalid balance format received from API');
|
|
61
|
-
}
|
|
58
|
+
const amount = (0, helpers_1.parseBlockchainAmount)(accountInfo[0].balance).value;
|
|
62
59
|
state.balanceCache = {
|
|
63
60
|
balance: amount,
|
|
64
61
|
timestamp: now
|
|
@@ -99,57 +96,63 @@ function createDiceContract(options = {}) {
|
|
|
99
96
|
const sender = ctx.sender;
|
|
100
97
|
const amountRaw = ctx.transfer.rawAmount;
|
|
101
98
|
try {
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
let parsedAmount;
|
|
100
|
+
try {
|
|
101
|
+
parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
|
|
104
102
|
}
|
|
105
|
-
|
|
106
|
-
if (amountTrim.length !== 2) {
|
|
103
|
+
catch (error) {
|
|
107
104
|
throw new Error('Invalid amount format');
|
|
108
105
|
}
|
|
109
|
-
const amountParsed =
|
|
110
|
-
if (amountParsed.
|
|
106
|
+
const amountParsed = parsedAmount.value;
|
|
107
|
+
if (amountParsed.isNegative()) {
|
|
111
108
|
throw new Error('Invalid amount value');
|
|
112
109
|
}
|
|
113
|
-
const amountCurrency =
|
|
110
|
+
const amountCurrency = parsedAmount.asset;
|
|
114
111
|
const transaction = await state.streamer.getTransaction(ctx.block.number, ctx.transaction.id);
|
|
115
112
|
const verify = await state.streamer.verifyTransfer(transaction, sender, account, amountRaw);
|
|
116
113
|
const balance = await getBalance();
|
|
117
114
|
const availableBalance = balance.minus(state.pendingPayouts);
|
|
118
115
|
if (verify) {
|
|
119
116
|
if (availableBalance.isLessThan(new bignumber_js_1.default(minBet * 2))) {
|
|
120
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
117
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] The server could not fulfill your bet.');
|
|
121
118
|
return;
|
|
122
119
|
}
|
|
123
120
|
if (!validCurrencies.includes(amountCurrency)) {
|
|
124
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
121
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] Invalid bet currency.');
|
|
125
122
|
return;
|
|
126
123
|
}
|
|
127
124
|
if (amountParsed.isLessThan(minBet) || amountParsed.isGreaterThan(maxBet)) {
|
|
128
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
125
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] You sent an invalid bet amount.');
|
|
129
126
|
return;
|
|
130
127
|
}
|
|
131
128
|
const roll = payload.roll;
|
|
132
129
|
const multiplier = new bignumber_js_1.default(1).minus(houseEdge).multipliedBy(100).dividedBy(roll);
|
|
133
130
|
const tokensWonBN = amountParsed.multipliedBy(multiplier);
|
|
134
|
-
const tokensWon =
|
|
131
|
+
const tokensWon = (0, helpers_1.formatBlockchainAmount)(tokensWonBN);
|
|
135
132
|
if (tokensWonBN.isGreaterThan(availableBalance)) {
|
|
136
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
133
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] The server could not fulfill your bet.');
|
|
137
134
|
return;
|
|
138
135
|
}
|
|
139
136
|
state.pendingPayouts = state.pendingPayouts.plus(tokensWonBN);
|
|
137
|
+
let payoutIncremented = true;
|
|
140
138
|
const random = rng(ctx.block.previousId, ctx.block.id, ctx.transaction.id);
|
|
141
139
|
const winningMemo = `You won ${tokensWon} ${tokenSymbol}. Roll: ${random}, Your guess: ${roll}`;
|
|
142
|
-
const losingMemo = `You lost ${
|
|
140
|
+
const losingMemo = `You lost ${(0, helpers_1.formatBlockchainAmount)(amountParsed)} ${tokenSymbol}. Roll: ${random}, Your guess: ${roll}`;
|
|
143
141
|
try {
|
|
144
142
|
if (random < roll) {
|
|
145
143
|
await state.streamer.transferHiveTokens(account, sender, tokensWon, tokenSymbol, winningMemo);
|
|
144
|
+
// Invalidate balance cache after payout
|
|
145
|
+
state.balanceCache = null;
|
|
146
146
|
}
|
|
147
147
|
else {
|
|
148
148
|
await state.streamer.transferHiveTokens(account, sender, '0.001', tokenSymbol, losingMemo);
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
finally {
|
|
152
|
-
|
|
152
|
+
if (payoutIncremented) {
|
|
153
|
+
state.pendingPayouts = state.pendingPayouts.minus(tokensWonBN);
|
|
154
|
+
payoutIncremented = false;
|
|
155
|
+
}
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
158
|
}
|
|
@@ -163,10 +166,10 @@ function createDiceContract(options = {}) {
|
|
|
163
166
|
});
|
|
164
167
|
try {
|
|
165
168
|
if (amountRaw && typeof amountRaw === 'string' && amountRaw.includes(' ')) {
|
|
166
|
-
const
|
|
167
|
-
const amountBN =
|
|
169
|
+
const parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
|
|
170
|
+
const amountBN = parsedAmount.value;
|
|
168
171
|
if (!amountBN.isNaN() && amountBN.isFinite() && !amountBN.isNegative()) {
|
|
169
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
172
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] Processing error occurred.');
|
|
170
173
|
}
|
|
171
174
|
}
|
|
172
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDomainRegistryContract = createDomainRegistryContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'domains';
|
|
8
|
+
const domainNameSchema = zod_1.z.string().min(3).max(63).regex(/^[a-z0-9-]+$/, 'Invalid domain label');
|
|
9
|
+
function createDomainRegistryContract(options = {}) {
|
|
10
|
+
const name = options.name || DEFAULT_NAME;
|
|
11
|
+
const state = (0, helpers_1.createContractState)();
|
|
12
|
+
const createNamespaceSchema = zod_1.z.object({
|
|
13
|
+
namespace: domainNameSchema,
|
|
14
|
+
title: zod_1.z.string().min(3).max(140),
|
|
15
|
+
registrationPrice: helpers_1.amountSchema,
|
|
16
|
+
asset: helpers_1.assetSchema,
|
|
17
|
+
renewalDays: zod_1.z.number().int().min(1).max(3650),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const registerNameSchema = zod_1.z.object({
|
|
21
|
+
namespace: domainNameSchema,
|
|
22
|
+
label: domainNameSchema,
|
|
23
|
+
target: zod_1.z.string().min(1).max(280),
|
|
24
|
+
years: zod_1.z.number().int().min(1).max(20).optional(),
|
|
25
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
26
|
+
});
|
|
27
|
+
const transferSchema = zod_1.z.object({
|
|
28
|
+
namespace: domainNameSchema,
|
|
29
|
+
label: domainNameSchema,
|
|
30
|
+
to: zod_1.z.string().min(3).max(32)
|
|
31
|
+
});
|
|
32
|
+
const expireSchema = zod_1.z.object({
|
|
33
|
+
namespace: domainNameSchema.optional()
|
|
34
|
+
}).optional();
|
|
35
|
+
const initialize = async () => {
|
|
36
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
37
|
+
`
|
|
38
|
+
CREATE TABLE IF NOT EXISTS domain_namespaces (
|
|
39
|
+
namespace TEXT PRIMARY KEY,
|
|
40
|
+
owner TEXT NOT NULL,
|
|
41
|
+
title TEXT NOT NULL,
|
|
42
|
+
registration_price TEXT NOT NULL,
|
|
43
|
+
asset TEXT NOT NULL,
|
|
44
|
+
renewal_days INTEGER NOT NULL,
|
|
45
|
+
metadata TEXT,
|
|
46
|
+
created_at DATETIME NOT NULL
|
|
47
|
+
)
|
|
48
|
+
`,
|
|
49
|
+
`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS domain_records (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
namespace TEXT NOT NULL,
|
|
53
|
+
label TEXT NOT NULL,
|
|
54
|
+
owner TEXT NOT NULL,
|
|
55
|
+
target TEXT NOT NULL,
|
|
56
|
+
status TEXT NOT NULL,
|
|
57
|
+
expires_at DATETIME NOT NULL,
|
|
58
|
+
metadata TEXT,
|
|
59
|
+
created_at DATETIME NOT NULL,
|
|
60
|
+
updated_at DATETIME NOT NULL,
|
|
61
|
+
UNIQUE(namespace, label)
|
|
62
|
+
)
|
|
63
|
+
`
|
|
64
|
+
]);
|
|
65
|
+
};
|
|
66
|
+
const createNamespace = async (payload, ctx) => {
|
|
67
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
68
|
+
const existing = await state.adapter.query('SELECT namespace FROM domain_namespaces WHERE namespace = ?', [payload.namespace]);
|
|
69
|
+
if (existing.length > 0) {
|
|
70
|
+
throw new Error(`Namespace ${payload.namespace} already exists`);
|
|
71
|
+
}
|
|
72
|
+
await state.adapter.query(`INSERT INTO domain_namespaces (
|
|
73
|
+
namespace, owner, title, registration_price, asset, renewal_days, metadata, created_at
|
|
74
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
75
|
+
payload.namespace,
|
|
76
|
+
owner,
|
|
77
|
+
payload.title,
|
|
78
|
+
payload.registrationPrice,
|
|
79
|
+
payload.asset,
|
|
80
|
+
payload.renewalDays,
|
|
81
|
+
JSON.stringify(payload.metadata || {}),
|
|
82
|
+
new Date()
|
|
83
|
+
]);
|
|
84
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createNamespace', payload, {
|
|
85
|
+
action: 'domain_namespace_created',
|
|
86
|
+
data: {
|
|
87
|
+
namespace: payload.namespace,
|
|
88
|
+
owner
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
const registerName = async (payload, ctx) => {
|
|
93
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
94
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
95
|
+
const namespaceRows = await state.adapter.query('SELECT * FROM domain_namespaces WHERE namespace = ?', [payload.namespace]);
|
|
96
|
+
if (namespaceRows.length === 0) {
|
|
97
|
+
throw new Error(`Namespace ${payload.namespace} does not exist`);
|
|
98
|
+
}
|
|
99
|
+
const namespace = namespaceRows[0];
|
|
100
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, namespace.asset);
|
|
101
|
+
const termYears = payload.years || 1;
|
|
102
|
+
const expectedAmount = (0, helpers_1.toBigNumber)(namespace.registration_price).multipliedBy(termYears);
|
|
103
|
+
if (!(0, helpers_1.toBigNumber)(payment.amount).eq(expectedAmount)) {
|
|
104
|
+
throw new Error(`Registration requires ${expectedAmount.toFixed()} ${namespace.asset}`);
|
|
105
|
+
}
|
|
106
|
+
const existing = await state.adapter.query('SELECT * FROM domain_records WHERE namespace = ? AND label = ?', [payload.namespace, payload.label]);
|
|
107
|
+
if (existing.length > 0) {
|
|
108
|
+
const record = existing[0];
|
|
109
|
+
const expiresAt = (0, helpers_1.parseDateValue)(record.expires_at);
|
|
110
|
+
if (record.status === 'active' && expiresAt && expiresAt > new Date()) {
|
|
111
|
+
throw new Error('Domain name is already registered');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const expiresAt = new Date(Date.now() + termYears * Number(namespace.renewal_days) * 24 * 60 * 60 * 1000);
|
|
115
|
+
await state.adapter.query(`INSERT INTO domain_records (
|
|
116
|
+
namespace, label, owner, target, status, expires_at, metadata, created_at, updated_at
|
|
117
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
118
|
+
ON CONFLICT(namespace, label)
|
|
119
|
+
DO UPDATE SET owner = excluded.owner, target = excluded.target, status = excluded.status, expires_at = excluded.expires_at, metadata = excluded.metadata, updated_at = excluded.updated_at`, [
|
|
120
|
+
payload.namespace,
|
|
121
|
+
payload.label,
|
|
122
|
+
owner,
|
|
123
|
+
payload.target,
|
|
124
|
+
'active',
|
|
125
|
+
expiresAt,
|
|
126
|
+
JSON.stringify(payload.metadata || {}),
|
|
127
|
+
new Date(),
|
|
128
|
+
new Date()
|
|
129
|
+
]);
|
|
130
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'registerName', payload, {
|
|
131
|
+
action: 'domain_registered',
|
|
132
|
+
data: {
|
|
133
|
+
namespace: payload.namespace,
|
|
134
|
+
label: payload.label,
|
|
135
|
+
owner,
|
|
136
|
+
expiresAt
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
const renewName = async (payload, ctx) => {
|
|
141
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
142
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
143
|
+
const namespaceRows = await state.adapter.query('SELECT * FROM domain_namespaces WHERE namespace = ?', [payload.namespace]);
|
|
144
|
+
const recordRows = await state.adapter.query('SELECT * FROM domain_records WHERE namespace = ? AND label = ?', [payload.namespace, payload.label]);
|
|
145
|
+
if (namespaceRows.length === 0 || recordRows.length === 0) {
|
|
146
|
+
throw new Error('Domain record does not exist');
|
|
147
|
+
}
|
|
148
|
+
const namespace = namespaceRows[0];
|
|
149
|
+
const record = recordRows[0];
|
|
150
|
+
if (record.owner !== owner) {
|
|
151
|
+
throw new Error('Only the domain owner can renew the name');
|
|
152
|
+
}
|
|
153
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, namespace.asset);
|
|
154
|
+
const termYears = payload.years || 1;
|
|
155
|
+
const expectedAmount = (0, helpers_1.toBigNumber)(namespace.registration_price).multipliedBy(termYears);
|
|
156
|
+
if (!(0, helpers_1.toBigNumber)(payment.amount).eq(expectedAmount)) {
|
|
157
|
+
throw new Error(`Renewal requires ${expectedAmount.toFixed()} ${namespace.asset}`);
|
|
158
|
+
}
|
|
159
|
+
const baseDate = (0, helpers_1.parseDateValue)(record.expires_at) && (0, helpers_1.parseDateValue)(record.expires_at) > new Date()
|
|
160
|
+
? (0, helpers_1.parseDateValue)(record.expires_at)
|
|
161
|
+
: new Date();
|
|
162
|
+
const expiresAt = new Date(baseDate.getTime() + termYears * Number(namespace.renewal_days) * 24 * 60 * 60 * 1000);
|
|
163
|
+
await state.adapter.query('UPDATE domain_records SET expires_at = ?, status = ?, updated_at = ? WHERE namespace = ? AND label = ?', [expiresAt, 'active', new Date(), payload.namespace, payload.label]);
|
|
164
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'renewName', payload, {
|
|
165
|
+
action: 'domain_renewed',
|
|
166
|
+
data: {
|
|
167
|
+
namespace: payload.namespace,
|
|
168
|
+
label: payload.label,
|
|
169
|
+
owner,
|
|
170
|
+
expiresAt
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const transferName = async (payload, ctx) => {
|
|
175
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
176
|
+
const rows = await state.adapter.query('SELECT * FROM domain_records WHERE namespace = ? AND label = ?', [payload.namespace, payload.label]);
|
|
177
|
+
if (rows.length === 0) {
|
|
178
|
+
throw new Error('Domain record does not exist');
|
|
179
|
+
}
|
|
180
|
+
const record = rows[0];
|
|
181
|
+
if (record.owner !== owner) {
|
|
182
|
+
throw new Error('Only the domain owner can transfer the name');
|
|
183
|
+
}
|
|
184
|
+
await state.adapter.query('UPDATE domain_records SET owner = ?, updated_at = ? WHERE namespace = ? AND label = ?', [payload.to, new Date(), payload.namespace, payload.label]);
|
|
185
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'transferName', payload, {
|
|
186
|
+
action: 'domain_transferred',
|
|
187
|
+
data: {
|
|
188
|
+
namespace: payload.namespace,
|
|
189
|
+
label: payload.label,
|
|
190
|
+
from: owner,
|
|
191
|
+
to: payload.to
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
const expireNames = async (payload = {}, _ctx) => {
|
|
196
|
+
const rows = payload.namespace
|
|
197
|
+
? await state.adapter.query('SELECT * FROM domain_records WHERE namespace = ?', [payload.namespace])
|
|
198
|
+
: await state.adapter.query('SELECT * FROM domain_records', []);
|
|
199
|
+
const now = new Date();
|
|
200
|
+
for (const record of rows) {
|
|
201
|
+
const expiresAt = (0, helpers_1.parseDateValue)(record.expires_at);
|
|
202
|
+
if (expiresAt && expiresAt < now && record.status === 'active') {
|
|
203
|
+
await state.adapter.query('UPDATE domain_records SET status = ?, updated_at = ? WHERE namespace = ? AND label = ?', ['expired', now, record.namespace, record.label]);
|
|
204
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'expireNames', payload, {
|
|
205
|
+
action: 'domain_expired',
|
|
206
|
+
data: {
|
|
207
|
+
namespace: record.namespace,
|
|
208
|
+
label: record.label,
|
|
209
|
+
owner: record.owner
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
return (0, contract_1.defineContract)({
|
|
216
|
+
name,
|
|
217
|
+
hooks: {
|
|
218
|
+
create: async ({ adapter }) => {
|
|
219
|
+
state.adapter = adapter;
|
|
220
|
+
await initialize();
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
actions: {
|
|
224
|
+
createNamespace: (0, contract_1.action)(createNamespace, { schema: createNamespaceSchema, trigger: 'custom_json' }),
|
|
225
|
+
registerName: (0, contract_1.action)(registerName, { schema: registerNameSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
226
|
+
renewName: (0, contract_1.action)(renewName, { schema: registerNameSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
227
|
+
transferName: (0, contract_1.action)(transferName, { schema: transferSchema, trigger: 'custom_json' }),
|
|
228
|
+
expireNames: (0, contract_1.action)(expireNames, { schema: expireSchema, trigger: ['custom_json', 'time'] })
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=domainregistry.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainregistry.contract.js","sourceRoot":"","sources":["../../src/contracts/domainregistry.contract.ts"],"names":[],"mappings":";;AAuBA,oEAyQC;AAhSD,6BAAwB;AACxB,yCAAoD;AACpD,uCAYmB;AAEnB,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,gBAAgB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;AAMjG,SAAgB,4BAA4B,CAAC,UAAyC,EAAE;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,6BAAmB,GAAE,CAAC;IAEpC,MAAM,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;QACnC,SAAS,EAAE,gBAAgB;QAC3B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,iBAAiB,EAAE,sBAAY;QAC/B,KAAK,EAAE,qBAAW;QAClB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9C,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;QAChC,SAAS,EAAE,gBAAgB;QAC3B,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAClC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;QAC5B,SAAS,EAAE,gBAAgB;QAC3B,KAAK,EAAE,gBAAgB;QACvB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;QAC1B,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEd,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE;YAClC;;;;;;;;;;;aAWC;YACD;;;;;;;;;;;;;;aAcC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAA8C,EAAE,GAAQ,EAAE,EAAE;QACvF,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,6DAA6D,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/H,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,SAAS,iBAAiB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;8CAEkC,EAClC;YACI,OAAO,CAAC,SAAS;YACjB,KAAK;YACL,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,iBAAiB;YACzB,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,WAAW;YACnB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE;SACb,CACJ,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE;YACrE,MAAM,EAAE,0BAA0B;YAClC,IAAI,EAAE;gBACF,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAA2C,EAAE,GAAQ,EAAE,EAAE;QACjF,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,GAAG,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5H,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,SAAS,iBAAiB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,IAAA,4BAAkB,EAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,IAAA,qBAAW,EAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,yBAAyB,cAAc,CAAC,OAAO,EAAE,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACjJ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1G,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;;;uMAI2L,EAC3L;YACI,OAAO,CAAC,SAAS;YACjB,OAAO,CAAC,KAAK;YACb,KAAK;YACL,OAAO,CAAC,MAAM;YACd,QAAQ;YACR,SAAS;YACT,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,cAAc,EAAE,OAAO,EAAE;YAClE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE;gBACF,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK;gBACL,SAAS;aACZ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,OAA2C,EAAE,GAAQ,EAAE,EAAE;QAC9E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,GAAG,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5H,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACnJ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QAED,IAAA,4BAAkB,EAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,IAAA,qBAAW,EAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,oBAAoB,cAAc,CAAC,OAAO,EAAE,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAA,wBAAc,EAAC,MAAM,CAAC,UAAU,CAAE,GAAG,IAAI,IAAI,EAAE;YACjG,CAAC,CAAC,IAAA,wBAAc,EAAC,MAAM,CAAC,UAAU,CAAE;YACpC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAElH,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wGAAwG,EACxG,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CACtE,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;YAC/D,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE;gBACF,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK;gBACL,SAAS;aACZ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAuC,EAAE,GAAQ,EAAE,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7I,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,uFAAuF,EACvF,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAC7D,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;YAClE,MAAM,EAAE,oBAAoB;YAC5B,IAAI,EAAE;gBACF,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,OAAO,CAAC,EAAE;aACjB;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,UAAkC,EAAE,EAAE,IAAS,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS;YAC1B,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACpG,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,SAAS,IAAI,SAAS,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wFAAwF,EACxF,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;gBAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;oBACjE,MAAM,EAAE,gBAAgB;oBACxB,IAAI,EAAE;wBACF,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACtB;iBACJ,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,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,eAAe,EAAE,IAAA,iBAAM,EAAC,eAAe,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACnG,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/G,SAAS,EAAE,IAAA,iBAAM,EAAC,SAAS,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACzG,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACtF,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;SAC/F;KACJ,CAAC,CAAC;AACP,CAAC"}
|