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
|
@@ -133,6 +133,7 @@ function createCoinflipContract(options = {}) {
|
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
135
|
state.pendingPayouts = state.pendingPayouts.plus(potentialPayout);
|
|
136
|
+
let payoutIncremented = true;
|
|
136
137
|
try {
|
|
137
138
|
const serverSeed = (0, uuid_1.v4)();
|
|
138
139
|
if (!serverSeed || typeof serverSeed !== 'string') {
|
|
@@ -153,6 +154,8 @@ function createCoinflipContract(options = {}) {
|
|
|
153
154
|
}
|
|
154
155
|
});
|
|
155
156
|
await state.streamer.transferHiveTokens(account, sender, potentialPayout.toFixed(3), amountTrim[1], `[Winner] | Guess: ${payload.guess} | Server Roll: ${generatedGuess} | Previous block id: ${ctx.block.previousId} | BlockID: ${ctx.block.id} | Trx ID: ${ctx.transaction.id} | Server Seed: ${serverSeed}`);
|
|
157
|
+
// Invalidate balance cache after payout
|
|
158
|
+
state.balanceCache = null;
|
|
156
159
|
return;
|
|
157
160
|
}
|
|
158
161
|
await state.adapter.addEvent(new Date(), name, 'flip', payload, {
|
|
@@ -169,7 +172,10 @@ function createCoinflipContract(options = {}) {
|
|
|
169
172
|
await state.streamer.transferHiveTokens(account, sender, '0.001', amountTrim[1], `[Lost] | Guess: ${payload.guess} | Server Roll: ${generatedGuess} | Previous block id: ${ctx.block.previousId} | BlockID: ${ctx.block.id} | Trx ID: ${ctx.transaction.id} | Server Seed: ${serverSeed}`);
|
|
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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coinflip.contract.js","sourceRoot":"","sources":["../../src/contracts/coinflip.contract.ts"],"names":[],"mappings":";;;;;AAoCA,
|
|
1
|
+
{"version":3,"file":"coinflip.contract.js","sourceRoot":"","sources":["../../src/contracts/coinflip.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCrowdfundContract = createCrowdfundContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'crowdfund';
|
|
8
|
+
function createCrowdfundContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const milestoneSchema = zod_1.z.object({
|
|
12
|
+
title: zod_1.z.string().min(1).max(140),
|
|
13
|
+
targetPercent: zod_1.z.number().min(1).max(100)
|
|
14
|
+
});
|
|
15
|
+
const createCampaignSchema = zod_1.z.object({
|
|
16
|
+
campaignId: helpers_1.identifierSchema,
|
|
17
|
+
title: zod_1.z.string().min(3).max(140),
|
|
18
|
+
description: zod_1.z.string().max(1000).optional(),
|
|
19
|
+
targetAmount: helpers_1.amountSchema,
|
|
20
|
+
asset: helpers_1.assetSchema,
|
|
21
|
+
deadline: zod_1.z.string(),
|
|
22
|
+
beneficiary: zod_1.z.string().min(3).max(32).optional(),
|
|
23
|
+
milestones: zod_1.z.array(milestoneSchema).max(10).optional(),
|
|
24
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
25
|
+
});
|
|
26
|
+
const campaignIdSchema = zod_1.z.object({
|
|
27
|
+
campaignId: helpers_1.identifierSchema
|
|
28
|
+
});
|
|
29
|
+
const releaseMilestoneSchema = zod_1.z.object({
|
|
30
|
+
campaignId: helpers_1.identifierSchema,
|
|
31
|
+
milestoneIndex: zod_1.z.number().int().min(0)
|
|
32
|
+
});
|
|
33
|
+
const initialize = async () => {
|
|
34
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
35
|
+
`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS crowdfund_campaigns (
|
|
37
|
+
campaign_id TEXT PRIMARY KEY,
|
|
38
|
+
creator TEXT NOT NULL,
|
|
39
|
+
beneficiary TEXT NOT NULL,
|
|
40
|
+
title TEXT NOT NULL,
|
|
41
|
+
description TEXT,
|
|
42
|
+
target_amount TEXT NOT NULL,
|
|
43
|
+
current_amount TEXT NOT NULL,
|
|
44
|
+
asset TEXT NOT NULL,
|
|
45
|
+
deadline DATETIME NOT NULL,
|
|
46
|
+
status TEXT NOT NULL,
|
|
47
|
+
metadata TEXT,
|
|
48
|
+
created_at DATETIME NOT NULL,
|
|
49
|
+
finalized_at DATETIME
|
|
50
|
+
)
|
|
51
|
+
`,
|
|
52
|
+
`
|
|
53
|
+
CREATE TABLE IF NOT EXISTS crowdfund_contributions (
|
|
54
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
55
|
+
campaign_id TEXT NOT NULL,
|
|
56
|
+
contributor TEXT NOT NULL,
|
|
57
|
+
amount TEXT NOT NULL,
|
|
58
|
+
asset TEXT NOT NULL,
|
|
59
|
+
transaction_id TEXT NOT NULL,
|
|
60
|
+
refunded INTEGER NOT NULL,
|
|
61
|
+
created_at DATETIME NOT NULL
|
|
62
|
+
)
|
|
63
|
+
`,
|
|
64
|
+
`
|
|
65
|
+
CREATE TABLE IF NOT EXISTS crowdfund_milestones (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
campaign_id TEXT NOT NULL,
|
|
68
|
+
milestone_index INTEGER NOT NULL,
|
|
69
|
+
title TEXT NOT NULL,
|
|
70
|
+
target_percent REAL NOT NULL,
|
|
71
|
+
status TEXT NOT NULL,
|
|
72
|
+
released_amount TEXT,
|
|
73
|
+
released_at DATETIME,
|
|
74
|
+
created_at DATETIME NOT NULL,
|
|
75
|
+
UNIQUE(campaign_id, milestone_index)
|
|
76
|
+
)
|
|
77
|
+
`
|
|
78
|
+
]);
|
|
79
|
+
};
|
|
80
|
+
const createCampaign = async (payload, ctx) => {
|
|
81
|
+
const creator = (0, helpers_1.requireSender)(ctx);
|
|
82
|
+
const existing = await state.adapter.query('SELECT campaign_id FROM crowdfund_campaigns WHERE campaign_id = ?', [payload.campaignId]);
|
|
83
|
+
if (existing.length > 0) {
|
|
84
|
+
throw new Error(`Campaign ${payload.campaignId} already exists`);
|
|
85
|
+
}
|
|
86
|
+
const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
|
|
87
|
+
if (!deadline || deadline <= new Date()) {
|
|
88
|
+
throw new Error('Campaign deadline must be in the future');
|
|
89
|
+
}
|
|
90
|
+
await state.adapter.query(`INSERT INTO crowdfund_campaigns (
|
|
91
|
+
campaign_id, creator, beneficiary, title, description, target_amount, current_amount, asset, deadline, status, metadata, created_at, finalized_at
|
|
92
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
93
|
+
payload.campaignId,
|
|
94
|
+
creator,
|
|
95
|
+
payload.beneficiary || creator,
|
|
96
|
+
payload.title,
|
|
97
|
+
payload.description || '',
|
|
98
|
+
payload.targetAmount,
|
|
99
|
+
'0',
|
|
100
|
+
payload.asset,
|
|
101
|
+
deadline,
|
|
102
|
+
'open',
|
|
103
|
+
JSON.stringify(payload.metadata || {}),
|
|
104
|
+
new Date(),
|
|
105
|
+
null
|
|
106
|
+
]);
|
|
107
|
+
const milestones = payload.milestones || [];
|
|
108
|
+
if (milestones.length > 0) {
|
|
109
|
+
const totalPercent = milestones.reduce((sum, m) => sum + m.targetPercent, 0);
|
|
110
|
+
if (totalPercent > 100) {
|
|
111
|
+
throw new Error('Milestone percentages cannot exceed 100%');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (let index = 0; index < milestones.length; index++) {
|
|
115
|
+
const milestone = milestones[index];
|
|
116
|
+
await state.adapter.query(`INSERT INTO crowdfund_milestones (
|
|
117
|
+
campaign_id, milestone_index, title, target_percent, status, released_amount, released_at, created_at
|
|
118
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [payload.campaignId, index, milestone.title, milestone.targetPercent, 'pending', null, null, new Date()]);
|
|
119
|
+
}
|
|
120
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createCampaign', payload, {
|
|
121
|
+
action: 'crowdfund_campaign_created',
|
|
122
|
+
data: {
|
|
123
|
+
campaignId: payload.campaignId,
|
|
124
|
+
creator
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const contribute = async (payload, ctx) => {
|
|
129
|
+
const contributor = (0, helpers_1.requireSender)(ctx);
|
|
130
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
131
|
+
const rows = await state.adapter.query('SELECT * FROM crowdfund_campaigns WHERE campaign_id = ?', [payload.campaignId]);
|
|
132
|
+
if (rows.length === 0) {
|
|
133
|
+
throw new Error(`Campaign ${payload.campaignId} does not exist`);
|
|
134
|
+
}
|
|
135
|
+
const campaign = rows[0];
|
|
136
|
+
const deadline = (0, helpers_1.parseDateValue)(campaign.deadline) || new Date();
|
|
137
|
+
if (campaign.status !== 'open' && campaign.status !== 'target_met') {
|
|
138
|
+
throw new Error('Campaign is not accepting contributions');
|
|
139
|
+
}
|
|
140
|
+
if (deadline <= new Date()) {
|
|
141
|
+
throw new Error('Campaign deadline has passed');
|
|
142
|
+
}
|
|
143
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, campaign.asset);
|
|
144
|
+
const currentAmount = (0, helpers_1.toBigNumber)(campaign.current_amount).plus(payment.amount);
|
|
145
|
+
const nextStatus = currentAmount.gte(campaign.target_amount)
|
|
146
|
+
? 'target_met'
|
|
147
|
+
: campaign.status;
|
|
148
|
+
await state.adapter.query('INSERT INTO crowdfund_contributions (campaign_id, contributor, amount, asset, transaction_id, refunded, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [payload.campaignId, contributor, payment.amount, payment.asset, ctx.transaction.id, 0, new Date()]);
|
|
149
|
+
await state.adapter.query('UPDATE crowdfund_campaigns SET current_amount = ?, status = ? WHERE campaign_id = ?', [currentAmount.toFixed(), nextStatus, payload.campaignId]);
|
|
150
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'contribute', payload, {
|
|
151
|
+
action: 'crowdfund_contribution_received',
|
|
152
|
+
data: {
|
|
153
|
+
campaignId: payload.campaignId,
|
|
154
|
+
contributor,
|
|
155
|
+
amount: payment.amount,
|
|
156
|
+
asset: payment.asset,
|
|
157
|
+
currentAmount: currentAmount.toFixed()
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
const finalizeCampaign = async (payload, ctx) => {
|
|
162
|
+
const rows = await state.adapter.query('SELECT * FROM crowdfund_campaigns WHERE campaign_id = ?', [payload.campaignId]);
|
|
163
|
+
if (rows.length === 0) {
|
|
164
|
+
throw new Error(`Campaign ${payload.campaignId} does not exist`);
|
|
165
|
+
}
|
|
166
|
+
const campaign = rows[0];
|
|
167
|
+
if (campaign.status === 'funded' || campaign.status === 'failed') {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (ctx.trigger !== 'time') {
|
|
171
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
172
|
+
if (sender !== campaign.creator) {
|
|
173
|
+
throw new Error('Only the campaign creator can finalize this campaign');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const deadline = (0, helpers_1.parseDateValue)(campaign.deadline) || new Date();
|
|
177
|
+
const goalReached = (0, helpers_1.toBigNumber)(campaign.current_amount).gte(campaign.target_amount);
|
|
178
|
+
if (!goalReached && deadline > new Date()) {
|
|
179
|
+
throw new Error('Campaign cannot be finalized before the deadline unless the target is met');
|
|
180
|
+
}
|
|
181
|
+
const status = goalReached ? 'funded' : 'failed';
|
|
182
|
+
await state.adapter.query('UPDATE crowdfund_campaigns SET status = ?, finalized_at = ? WHERE campaign_id = ?', [status, new Date(), payload.campaignId]);
|
|
183
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'finalizeCampaign', payload, {
|
|
184
|
+
action: 'crowdfund_campaign_finalized',
|
|
185
|
+
data: {
|
|
186
|
+
campaignId: payload.campaignId,
|
|
187
|
+
status,
|
|
188
|
+
beneficiary: campaign.beneficiary,
|
|
189
|
+
amount: campaign.current_amount,
|
|
190
|
+
asset: campaign.asset
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
const releaseMilestone = async (payload, ctx) => {
|
|
195
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
196
|
+
const campaigns = await state.adapter.query('SELECT * FROM crowdfund_campaigns WHERE campaign_id = ?', [payload.campaignId]);
|
|
197
|
+
if (campaigns.length === 0) {
|
|
198
|
+
throw new Error(`Campaign ${payload.campaignId} does not exist`);
|
|
199
|
+
}
|
|
200
|
+
const campaign = campaigns[0];
|
|
201
|
+
if (campaign.creator !== sender) {
|
|
202
|
+
throw new Error('Only the campaign creator can release milestones');
|
|
203
|
+
}
|
|
204
|
+
if (campaign.status !== 'funded') {
|
|
205
|
+
throw new Error('Campaign must be funded before releasing milestones');
|
|
206
|
+
}
|
|
207
|
+
const rows = await state.adapter.query('SELECT * FROM crowdfund_milestones WHERE campaign_id = ? AND milestone_index = ?', [payload.campaignId, payload.milestoneIndex]);
|
|
208
|
+
if (rows.length === 0) {
|
|
209
|
+
throw new Error('Milestone does not exist');
|
|
210
|
+
}
|
|
211
|
+
const milestone = rows[0];
|
|
212
|
+
if (milestone.status === 'released') {
|
|
213
|
+
throw new Error('Milestone already released');
|
|
214
|
+
}
|
|
215
|
+
// Guard against total milestone releases exceeding campaign funds
|
|
216
|
+
const allMilestones = await state.adapter.query('SELECT * FROM crowdfund_milestones WHERE campaign_id = ?', [payload.campaignId]);
|
|
217
|
+
const totalReleasedPercent = allMilestones
|
|
218
|
+
.filter((m) => m.status === 'released')
|
|
219
|
+
.reduce((sum, m) => sum + Number(m.target_percent), 0);
|
|
220
|
+
if (totalReleasedPercent + Number(milestone.target_percent) > 100) {
|
|
221
|
+
throw new Error('Cannot release milestone: total released would exceed 100% of campaign funds');
|
|
222
|
+
}
|
|
223
|
+
const releasedAmount = (0, helpers_1.toBigNumber)(campaign.current_amount)
|
|
224
|
+
.multipliedBy(milestone.target_percent)
|
|
225
|
+
.dividedBy(100)
|
|
226
|
+
.toFixed();
|
|
227
|
+
await state.adapter.query('UPDATE crowdfund_milestones SET status = ?, released_amount = ?, released_at = ? WHERE campaign_id = ? AND milestone_index = ?', ['released', releasedAmount, new Date(), payload.campaignId, payload.milestoneIndex]);
|
|
228
|
+
// Transfer funds to the beneficiary
|
|
229
|
+
if (state.streamer) {
|
|
230
|
+
await state.streamer.transferHiveTokens(campaign.creator, campaign.beneficiary, (0, helpers_1.toBigNumber)(releasedAmount).toFixed(3), campaign.asset, `Crowdfund milestone release: ${payload.campaignId} #${payload.milestoneIndex}`);
|
|
231
|
+
}
|
|
232
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'releaseMilestone', payload, {
|
|
233
|
+
action: 'crowdfund_milestone_released',
|
|
234
|
+
data: {
|
|
235
|
+
campaignId: payload.campaignId,
|
|
236
|
+
milestoneIndex: payload.milestoneIndex,
|
|
237
|
+
releasedAmount,
|
|
238
|
+
beneficiary: campaign.beneficiary
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
};
|
|
242
|
+
const refundContribution = async (payload, ctx) => {
|
|
243
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
244
|
+
const campaigns = await state.adapter.query('SELECT * FROM crowdfund_campaigns WHERE campaign_id = ?', [payload.campaignId]);
|
|
245
|
+
if (campaigns.length === 0) {
|
|
246
|
+
throw new Error(`Campaign ${payload.campaignId} does not exist`);
|
|
247
|
+
}
|
|
248
|
+
const campaign = campaigns[0];
|
|
249
|
+
if (campaign.status !== 'failed') {
|
|
250
|
+
throw new Error('Refunds are only available for failed campaigns');
|
|
251
|
+
}
|
|
252
|
+
const contributions = await state.adapter.query('SELECT * FROM crowdfund_contributions WHERE campaign_id = ? AND contributor = ? AND refunded = ?', [payload.campaignId, sender, 0]);
|
|
253
|
+
if (contributions.length === 0) {
|
|
254
|
+
throw new Error('No refundable contribution found');
|
|
255
|
+
}
|
|
256
|
+
const totalRefund = contributions.reduce((sum, contribution) => sum.plus(contribution.amount), (0, helpers_1.toBigNumber)(0)).toFixed();
|
|
257
|
+
await state.adapter.query('UPDATE crowdfund_contributions SET refunded = ? WHERE campaign_id = ? AND contributor = ?', [1, payload.campaignId, sender]);
|
|
258
|
+
// Transfer refund to the contributor
|
|
259
|
+
if (state.streamer) {
|
|
260
|
+
await state.streamer.transferHiveTokens(campaign.creator, sender, (0, helpers_1.toBigNumber)(totalRefund).toFixed(3), campaign.asset, `Crowdfund refund: ${payload.campaignId}`);
|
|
261
|
+
}
|
|
262
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'refundContribution', payload, {
|
|
263
|
+
action: 'crowdfund_refund_requested',
|
|
264
|
+
data: {
|
|
265
|
+
campaignId: payload.campaignId,
|
|
266
|
+
contributor: sender,
|
|
267
|
+
refundAmount: totalRefund,
|
|
268
|
+
asset: campaign.asset
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
return (0, contract_1.defineContract)({
|
|
273
|
+
name,
|
|
274
|
+
hooks: {
|
|
275
|
+
create: async ({ adapter, streamer }) => {
|
|
276
|
+
state.adapter = adapter;
|
|
277
|
+
state.streamer = streamer;
|
|
278
|
+
await initialize();
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
actions: {
|
|
282
|
+
createCampaign: (0, contract_1.action)(createCampaign, { schema: createCampaignSchema, trigger: 'custom_json' }),
|
|
283
|
+
contribute: (0, contract_1.action)(contribute, { schema: campaignIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
284
|
+
finalizeCampaign: (0, contract_1.action)(finalizeCampaign, { schema: campaignIdSchema, trigger: ['custom_json', 'time'] }),
|
|
285
|
+
releaseMilestone: (0, contract_1.action)(releaseMilestone, { schema: releaseMilestoneSchema, trigger: 'custom_json' }),
|
|
286
|
+
refundContribution: (0, contract_1.action)(refundContribution, { schema: campaignIdSchema, trigger: 'custom_json' })
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=crowdfund.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crowdfund.contract.js","sourceRoot":"","sources":["../../src/contracts/crowdfund.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDcaBotContract = createDcaBotContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'dcabots';
|
|
8
|
+
function createDcaBotContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createBotSchema = zod_1.z.object({
|
|
12
|
+
botId: helpers_1.identifierSchema,
|
|
13
|
+
baseAsset: helpers_1.assetSchema,
|
|
14
|
+
quoteAsset: helpers_1.assetSchema,
|
|
15
|
+
amountPerInterval: helpers_1.amountSchema,
|
|
16
|
+
intervalHours: zod_1.z.number().int().min(1).max(24 * 30),
|
|
17
|
+
maxExecutions: zod_1.z.number().int().min(1).max(100000).optional(),
|
|
18
|
+
slippageBps: zod_1.z.number().int().min(0).max(10000).optional(),
|
|
19
|
+
startsAt: zod_1.z.string().optional(),
|
|
20
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
21
|
+
});
|
|
22
|
+
const botIdSchema = zod_1.z.object({
|
|
23
|
+
botId: helpers_1.identifierSchema
|
|
24
|
+
});
|
|
25
|
+
const executeSchema = zod_1.z.object({
|
|
26
|
+
botId: helpers_1.identifierSchema.optional()
|
|
27
|
+
}).optional();
|
|
28
|
+
const acknowledgeSchema = zod_1.z.object({
|
|
29
|
+
botId: helpers_1.identifierSchema,
|
|
30
|
+
executionId: zod_1.z.number().int().min(1),
|
|
31
|
+
status: zod_1.z.enum(['placed', 'filled', 'failed', 'cancelled']),
|
|
32
|
+
externalRef: zod_1.z.string().max(120).optional(),
|
|
33
|
+
notes: zod_1.z.string().max(500).optional()
|
|
34
|
+
});
|
|
35
|
+
const initialize = async () => {
|
|
36
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
37
|
+
`
|
|
38
|
+
CREATE TABLE IF NOT EXISTS dca_bots (
|
|
39
|
+
bot_id TEXT PRIMARY KEY,
|
|
40
|
+
owner TEXT NOT NULL,
|
|
41
|
+
base_asset TEXT NOT NULL,
|
|
42
|
+
quote_asset TEXT NOT NULL,
|
|
43
|
+
amount_per_interval TEXT NOT NULL,
|
|
44
|
+
interval_hours INTEGER NOT NULL,
|
|
45
|
+
max_executions INTEGER,
|
|
46
|
+
execution_count INTEGER NOT NULL,
|
|
47
|
+
slippage_bps INTEGER NOT NULL,
|
|
48
|
+
next_execute_at DATETIME NOT NULL,
|
|
49
|
+
status TEXT NOT NULL,
|
|
50
|
+
metadata TEXT,
|
|
51
|
+
created_at DATETIME NOT NULL,
|
|
52
|
+
updated_at DATETIME NOT NULL
|
|
53
|
+
)
|
|
54
|
+
`,
|
|
55
|
+
`
|
|
56
|
+
CREATE TABLE IF NOT EXISTS dca_executions (
|
|
57
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
58
|
+
bot_id TEXT NOT NULL,
|
|
59
|
+
execution_number INTEGER NOT NULL,
|
|
60
|
+
requested_at DATETIME NOT NULL,
|
|
61
|
+
status TEXT NOT NULL,
|
|
62
|
+
external_ref TEXT,
|
|
63
|
+
notes TEXT
|
|
64
|
+
)
|
|
65
|
+
`
|
|
66
|
+
]);
|
|
67
|
+
};
|
|
68
|
+
const createBot = async (payload, ctx) => {
|
|
69
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
70
|
+
const existing = await state.adapter.query('SELECT bot_id FROM dca_bots WHERE bot_id = ?', [payload.botId]);
|
|
71
|
+
if (existing.length > 0) {
|
|
72
|
+
throw new Error(`Bot ${payload.botId} already exists`);
|
|
73
|
+
}
|
|
74
|
+
const startsAt = (0, helpers_1.parseDateValue)(payload.startsAt) || new Date();
|
|
75
|
+
await state.adapter.query(`INSERT INTO dca_bots (
|
|
76
|
+
bot_id, owner, base_asset, quote_asset, amount_per_interval, interval_hours, max_executions, execution_count, slippage_bps,
|
|
77
|
+
next_execute_at, status, metadata, created_at, updated_at
|
|
78
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
79
|
+
payload.botId,
|
|
80
|
+
owner,
|
|
81
|
+
payload.baseAsset,
|
|
82
|
+
payload.quoteAsset,
|
|
83
|
+
payload.amountPerInterval,
|
|
84
|
+
payload.intervalHours,
|
|
85
|
+
payload.maxExecutions || null,
|
|
86
|
+
0,
|
|
87
|
+
payload.slippageBps || 0,
|
|
88
|
+
startsAt,
|
|
89
|
+
'active',
|
|
90
|
+
JSON.stringify(payload.metadata || {}),
|
|
91
|
+
new Date(),
|
|
92
|
+
new Date()
|
|
93
|
+
]);
|
|
94
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createBot', payload, {
|
|
95
|
+
action: 'dca_bot_created',
|
|
96
|
+
data: {
|
|
97
|
+
botId: payload.botId,
|
|
98
|
+
owner
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
const pauseBot = async (payload, ctx) => {
|
|
103
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
104
|
+
const bots = await state.adapter.query('SELECT * FROM dca_bots WHERE bot_id = ?', [payload.botId]);
|
|
105
|
+
if (bots.length === 0) {
|
|
106
|
+
throw new Error(`Bot ${payload.botId} does not exist`);
|
|
107
|
+
}
|
|
108
|
+
const bot = bots[0];
|
|
109
|
+
if (bot.owner !== owner) {
|
|
110
|
+
throw new Error('Only the bot owner can pause this bot');
|
|
111
|
+
}
|
|
112
|
+
await state.adapter.query('UPDATE dca_bots SET status = ?, updated_at = ? WHERE bot_id = ?', ['paused', new Date(), payload.botId]);
|
|
113
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'pauseBot', payload, {
|
|
114
|
+
action: 'dca_bot_paused',
|
|
115
|
+
data: {
|
|
116
|
+
botId: payload.botId,
|
|
117
|
+
owner
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
const resumeBot = async (payload, ctx) => {
|
|
122
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
123
|
+
const bots = await state.adapter.query('SELECT * FROM dca_bots WHERE bot_id = ?', [payload.botId]);
|
|
124
|
+
if (bots.length === 0) {
|
|
125
|
+
throw new Error(`Bot ${payload.botId} does not exist`);
|
|
126
|
+
}
|
|
127
|
+
const bot = bots[0];
|
|
128
|
+
if (bot.owner !== owner) {
|
|
129
|
+
throw new Error('Only the bot owner can resume this bot');
|
|
130
|
+
}
|
|
131
|
+
await state.adapter.query('UPDATE dca_bots SET status = ?, updated_at = ? WHERE bot_id = ?', ['active', new Date(), payload.botId]);
|
|
132
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'resumeBot', payload, {
|
|
133
|
+
action: 'dca_bot_resumed',
|
|
134
|
+
data: {
|
|
135
|
+
botId: payload.botId,
|
|
136
|
+
owner
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
const executeDueBots = async (payload = {}, _ctx) => {
|
|
141
|
+
const bots = payload.botId
|
|
142
|
+
? await state.adapter.query('SELECT * FROM dca_bots WHERE bot_id = ?', [payload.botId])
|
|
143
|
+
: await state.adapter.query('SELECT * FROM dca_bots WHERE status = ?', ['active']);
|
|
144
|
+
const now = new Date();
|
|
145
|
+
for (const bot of bots) {
|
|
146
|
+
if (bot.status !== 'active') {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const nextExecuteAt = (0, helpers_1.parseDateValue)(bot.next_execute_at) || now;
|
|
150
|
+
if (nextExecuteAt > now) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const executionNumber = Number(bot.execution_count || 0) + 1;
|
|
154
|
+
const maxExecutions = bot.max_executions ? Number(bot.max_executions) : null;
|
|
155
|
+
const nextStatus = maxExecutions && executionNumber >= maxExecutions
|
|
156
|
+
? 'completed'
|
|
157
|
+
: 'active';
|
|
158
|
+
const nextSchedule = new Date(now.getTime() + Number(bot.interval_hours) * 60 * 60 * 1000);
|
|
159
|
+
await state.adapter.query('INSERT INTO dca_executions (bot_id, execution_number, requested_at, status, external_ref, notes) VALUES (?, ?, ?, ?, ?, ?)', [bot.bot_id, executionNumber, now, 'queued', null, null]);
|
|
160
|
+
await state.adapter.query('UPDATE dca_bots SET execution_count = ?, next_execute_at = ?, status = ?, updated_at = ? WHERE bot_id = ?', [executionNumber, nextSchedule, nextStatus, now, bot.bot_id]);
|
|
161
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'executeDueBots', { botId: bot.bot_id }, {
|
|
162
|
+
action: 'dca_execution_requested',
|
|
163
|
+
data: {
|
|
164
|
+
botId: bot.bot_id,
|
|
165
|
+
owner: bot.owner,
|
|
166
|
+
executionNumber,
|
|
167
|
+
baseAsset: bot.base_asset,
|
|
168
|
+
quoteAsset: bot.quote_asset,
|
|
169
|
+
amountPerInterval: bot.amount_per_interval,
|
|
170
|
+
slippageBps: bot.slippage_bps
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const acknowledgeExecution = async (payload, ctx) => {
|
|
176
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
177
|
+
const bots = await state.adapter.query('SELECT * FROM dca_bots WHERE bot_id = ?', [payload.botId]);
|
|
178
|
+
if (bots.length === 0) {
|
|
179
|
+
throw new Error(`Bot ${payload.botId} does not exist`);
|
|
180
|
+
}
|
|
181
|
+
const bot = bots[0];
|
|
182
|
+
if (bot.owner !== owner) {
|
|
183
|
+
throw new Error('Only the bot owner can acknowledge executions');
|
|
184
|
+
}
|
|
185
|
+
const executions = await state.adapter.query('SELECT * FROM dca_executions WHERE id = ? AND bot_id = ?', [payload.executionId, payload.botId]);
|
|
186
|
+
if (executions.length === 0) {
|
|
187
|
+
throw new Error('Execution does not exist for this bot');
|
|
188
|
+
}
|
|
189
|
+
await state.adapter.query('UPDATE dca_executions SET status = ?, external_ref = ?, notes = ? WHERE id = ?', [payload.status, payload.externalRef || null, payload.notes || null, payload.executionId]);
|
|
190
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'acknowledgeExecution', payload, {
|
|
191
|
+
action: 'dca_execution_acknowledged',
|
|
192
|
+
data: {
|
|
193
|
+
botId: payload.botId,
|
|
194
|
+
executionId: payload.executionId,
|
|
195
|
+
status: payload.status,
|
|
196
|
+
externalRef: payload.externalRef || null
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
return (0, contract_1.defineContract)({
|
|
201
|
+
name,
|
|
202
|
+
hooks: {
|
|
203
|
+
create: async ({ adapter }) => {
|
|
204
|
+
state.adapter = adapter;
|
|
205
|
+
await initialize();
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
actions: {
|
|
209
|
+
createBot: (0, contract_1.action)(createBot, { schema: createBotSchema, trigger: 'custom_json' }),
|
|
210
|
+
pauseBot: (0, contract_1.action)(pauseBot, { schema: botIdSchema, trigger: 'custom_json' }),
|
|
211
|
+
resumeBot: (0, contract_1.action)(resumeBot, { schema: botIdSchema, trigger: 'custom_json' }),
|
|
212
|
+
executeDueBots: (0, contract_1.action)(executeDueBots, { schema: executeSchema, trigger: ['custom_json', 'time'] }),
|
|
213
|
+
acknowledgeExecution: (0, contract_1.action)(acknowledgeExecution, { schema: acknowledgeSchema, trigger: 'custom_json' })
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=dcabot.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dcabot.contract.js","sourceRoot":"","sources":["../../src/contracts/dcabot.contract.ts"],"names":[],"mappings":"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"}
|