hive-stream 2.0.5 → 3.0.0
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/.claude/settings.local.json +12 -0
- package/.env.example +2 -2
- package/.travis.yml +11 -11
- package/CHANGELOG.md +166 -0
- package/CLAUDE.md +75 -0
- package/LICENSE +21 -21
- package/README.md +338 -238
- package/dist/actions.d.ts +41 -10
- package/dist/actions.js +126 -23
- package/dist/actions.js.map +1 -1
- package/dist/adapters/base.adapter.d.ts +25 -25
- package/dist/adapters/base.adapter.js +63 -49
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +50 -37
- package/dist/adapters/mongodb.adapter.js +363 -158
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +49 -0
- package/dist/adapters/postgresql.adapter.js +507 -0
- package/dist/adapters/postgresql.adapter.js.map +1 -0
- package/dist/adapters/sqlite.adapter.d.ts +40 -41
- package/dist/adapters/sqlite.adapter.js +470 -397
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.d.ts +6 -6
- package/dist/api.js +95 -55
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +16 -16
- package/dist/config.js +18 -18
- package/dist/config.js.map +1 -1
- package/dist/contracts/coinflip.contract.d.ts +27 -14
- package/dist/contracts/coinflip.contract.js +253 -94
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/dice.contract.d.ts +37 -29
- package/dist/contracts/dice.contract.js +282 -155
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/lotto.contract.d.ts +20 -20
- package/dist/contracts/lotto.contract.js +246 -246
- package/dist/contracts/nft.contract.d.ts +24 -0
- package/dist/contracts/nft.contract.js +533 -0
- package/dist/contracts/nft.contract.js.map +1 -0
- package/dist/contracts/token.contract.d.ts +18 -0
- package/dist/contracts/token.contract.js +263 -0
- package/dist/contracts/token.contract.js.map +1 -0
- package/dist/exchanges/bittrex.d.ts +6 -6
- package/dist/exchanges/bittrex.js +34 -34
- package/dist/exchanges/coingecko.d.ts +5 -0
- package/dist/exchanges/coingecko.js +40 -0
- package/dist/exchanges/coingecko.js.map +1 -0
- package/dist/exchanges/exchange.d.ts +9 -9
- package/dist/exchanges/exchange.js +26 -26
- package/dist/hive-rates.d.ts +9 -9
- package/dist/hive-rates.js +121 -75
- package/dist/hive-rates.js.map +1 -1
- package/dist/index.d.ts +12 -11
- package/dist/index.js +33 -32
- package/dist/index.js.map +1 -1
- package/dist/streamer.d.ts +140 -93
- package/dist/streamer.js +793 -545
- package/dist/streamer.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.js +25 -25
- package/dist/test.js.map +1 -1
- package/dist/types/hive-stream.d.ts +35 -6
- package/dist/types/hive-stream.js +2 -2
- package/dist/utils.d.ts +27 -27
- package/dist/utils.js +271 -261
- package/dist/utils.js.map +1 -1
- package/ecosystem.config.js +17 -17
- package/jest.config.js +8 -8
- package/package.json +53 -48
- package/test-contract-block.md +18 -18
- package/tests/actions.spec.ts +252 -0
- package/tests/adapters/actions-persistence.spec.ts +144 -0
- package/tests/adapters/postgresql.adapter.spec.ts +127 -0
- package/tests/adapters/sqlite.adapter.spec.ts +180 -42
- package/tests/contracts/coinflip.contract.spec.ts +221 -131
- package/tests/contracts/dice.contract.spec.ts +202 -159
- package/tests/contracts/entrants.json +728 -728
- package/tests/contracts/lotto.contract.spec.ts +323 -323
- package/tests/contracts/nft.contract.spec.ts +948 -0
- package/tests/contracts/token.contract.spec.ts +334 -0
- package/tests/helpers/mock-adapter.ts +214 -0
- package/tests/setup.ts +29 -18
- package/tests/streamer-actions.spec.ts +263 -0
- package/tests/streamer.spec.ts +248 -151
- package/tests/utils.spec.ts +91 -94
- package/tsconfig.build.json +3 -22
- package/tslint.json +20 -20
- package/wallaby.js +26 -26
- package/.env +0 -3
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NFTContract = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const CONTRACT_NAME = 'hivenft';
|
|
9
|
+
class NFTContract {
|
|
10
|
+
_instance;
|
|
11
|
+
adapter;
|
|
12
|
+
blockNumber;
|
|
13
|
+
blockId;
|
|
14
|
+
previousBlockId;
|
|
15
|
+
transactionId;
|
|
16
|
+
async create() {
|
|
17
|
+
this.adapter = this._instance.getAdapter();
|
|
18
|
+
await this.initializeNFTTables();
|
|
19
|
+
}
|
|
20
|
+
destroy() {
|
|
21
|
+
// Cleanup logic if needed
|
|
22
|
+
}
|
|
23
|
+
updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
|
|
24
|
+
this.blockNumber = blockNumber;
|
|
25
|
+
this.blockId = blockId;
|
|
26
|
+
this.previousBlockId = previousBlockId;
|
|
27
|
+
this.transactionId = transactionId;
|
|
28
|
+
}
|
|
29
|
+
async initializeNFTTables() {
|
|
30
|
+
try {
|
|
31
|
+
await this.adapter.query(`
|
|
32
|
+
CREATE TABLE IF NOT EXISTS nft_collections (
|
|
33
|
+
symbol TEXT PRIMARY KEY,
|
|
34
|
+
name TEXT NOT NULL,
|
|
35
|
+
description TEXT,
|
|
36
|
+
creator TEXT NOT NULL,
|
|
37
|
+
max_supply INTEGER,
|
|
38
|
+
current_supply INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
royalty REAL DEFAULT 0,
|
|
40
|
+
base_uri TEXT,
|
|
41
|
+
allow_updates BOOLEAN DEFAULT TRUE,
|
|
42
|
+
updateable_by_owner BOOLEAN DEFAULT FALSE,
|
|
43
|
+
created_at DATETIME NOT NULL
|
|
44
|
+
)
|
|
45
|
+
`);
|
|
46
|
+
await this.adapter.query(`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS nft_tokens (
|
|
48
|
+
token_id TEXT NOT NULL,
|
|
49
|
+
collection_symbol TEXT NOT NULL,
|
|
50
|
+
owner TEXT NOT NULL,
|
|
51
|
+
metadata TEXT,
|
|
52
|
+
attributes TEXT,
|
|
53
|
+
minted_at DATETIME NOT NULL,
|
|
54
|
+
minted_by TEXT NOT NULL,
|
|
55
|
+
burned BOOLEAN DEFAULT FALSE,
|
|
56
|
+
PRIMARY KEY (token_id, collection_symbol),
|
|
57
|
+
FOREIGN KEY (collection_symbol) REFERENCES nft_collections(symbol)
|
|
58
|
+
)
|
|
59
|
+
`);
|
|
60
|
+
await this.adapter.query(`
|
|
61
|
+
CREATE TABLE IF NOT EXISTS nft_listings (
|
|
62
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
63
|
+
token_id TEXT NOT NULL,
|
|
64
|
+
collection_symbol TEXT NOT NULL,
|
|
65
|
+
seller TEXT NOT NULL,
|
|
66
|
+
price TEXT NOT NULL,
|
|
67
|
+
currency TEXT NOT NULL DEFAULT 'HIVE',
|
|
68
|
+
listed_at DATETIME NOT NULL,
|
|
69
|
+
active BOOLEAN DEFAULT TRUE,
|
|
70
|
+
FOREIGN KEY (token_id, collection_symbol) REFERENCES nft_tokens(token_id, collection_symbol)
|
|
71
|
+
)
|
|
72
|
+
`);
|
|
73
|
+
await this.adapter.query(`
|
|
74
|
+
CREATE TABLE IF NOT EXISTS nft_transfers (
|
|
75
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
76
|
+
token_id TEXT NOT NULL,
|
|
77
|
+
collection_symbol TEXT NOT NULL,
|
|
78
|
+
from_account TEXT NOT NULL,
|
|
79
|
+
to_account TEXT NOT NULL,
|
|
80
|
+
transfer_type TEXT NOT NULL,
|
|
81
|
+
price TEXT,
|
|
82
|
+
currency TEXT,
|
|
83
|
+
block_number INTEGER NOT NULL,
|
|
84
|
+
transaction_id TEXT NOT NULL,
|
|
85
|
+
timestamp DATETIME NOT NULL,
|
|
86
|
+
FOREIGN KEY (token_id, collection_symbol) REFERENCES nft_tokens(token_id, collection_symbol)
|
|
87
|
+
)
|
|
88
|
+
`);
|
|
89
|
+
await this.adapter.query(`
|
|
90
|
+
CREATE INDEX IF NOT EXISTS idx_nft_tokens_owner ON nft_tokens(owner);
|
|
91
|
+
`);
|
|
92
|
+
await this.adapter.query(`
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_nft_tokens_collection ON nft_tokens(collection_symbol);
|
|
94
|
+
`);
|
|
95
|
+
await this.adapter.query(`
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_nft_listings_active ON nft_listings(active, collection_symbol);
|
|
97
|
+
`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('[NFTContract] Error initializing tables:', error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async createCollection(payload, { sender }) {
|
|
104
|
+
try {
|
|
105
|
+
const { symbol, name, description = '', maxSupply, royalty = 0, baseUri = '', allowUpdates = true, updateableByOwner = false } = payload;
|
|
106
|
+
if (!symbol.match(/^[A-Z0-9]{1,20}$/)) {
|
|
107
|
+
throw new Error('Symbol must be 1-20 uppercase alphanumeric characters');
|
|
108
|
+
}
|
|
109
|
+
if (!name || name.length > 100) {
|
|
110
|
+
throw new Error('Name is required and must be 100 characters or less');
|
|
111
|
+
}
|
|
112
|
+
if (description && description.length > 500) {
|
|
113
|
+
throw new Error('Description must be 500 characters or less');
|
|
114
|
+
}
|
|
115
|
+
if (maxSupply && (maxSupply < 1 || maxSupply > 1000000)) {
|
|
116
|
+
throw new Error('Maximum supply must be between 1 and 1,000,000');
|
|
117
|
+
}
|
|
118
|
+
if (royalty < 0 || royalty > 0.25) {
|
|
119
|
+
throw new Error('Royalty must be between 0 and 25%');
|
|
120
|
+
}
|
|
121
|
+
if (baseUri && baseUri.length > 500) {
|
|
122
|
+
throw new Error('Base URI must be 500 characters or less');
|
|
123
|
+
}
|
|
124
|
+
const existingCollection = await this.adapter.query('SELECT symbol FROM nft_collections WHERE symbol = ?', [symbol]);
|
|
125
|
+
if (existingCollection && existingCollection.length > 0) {
|
|
126
|
+
throw new Error(`Collection with symbol ${symbol} already exists`);
|
|
127
|
+
}
|
|
128
|
+
await this.adapter.query(`
|
|
129
|
+
INSERT INTO nft_collections (symbol, name, description, creator, max_supply, royalty, base_uri, allow_updates, updateable_by_owner, created_at)
|
|
130
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
131
|
+
`, [symbol, name, description, sender, maxSupply, royalty, baseUri, allowUpdates, updateableByOwner, new Date()]);
|
|
132
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'createCollection', payload, {
|
|
133
|
+
action: 'collection_created',
|
|
134
|
+
data: {
|
|
135
|
+
symbol,
|
|
136
|
+
name,
|
|
137
|
+
creator: sender,
|
|
138
|
+
maxSupply,
|
|
139
|
+
royalty
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
console.log(`[NFTContract] Collection ${symbol} created by ${sender}`);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('[NFTContract] Error creating collection:', error);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async mintNFT(payload, { sender }) {
|
|
150
|
+
try {
|
|
151
|
+
const { collectionSymbol, tokenId, to, metadata = '', attributes = '' } = payload;
|
|
152
|
+
const collection = await this.adapter.query('SELECT * FROM nft_collections WHERE symbol = ?', [collectionSymbol]);
|
|
153
|
+
if (!collection || collection.length === 0) {
|
|
154
|
+
throw new Error(`Collection ${collectionSymbol} does not exist`);
|
|
155
|
+
}
|
|
156
|
+
const collectionData = collection[0];
|
|
157
|
+
if (collectionData.creator !== sender) {
|
|
158
|
+
throw new Error('Only the collection creator can mint NFTs');
|
|
159
|
+
}
|
|
160
|
+
if (!tokenId.match(/^[A-Za-z0-9_-]{1,50}$/)) {
|
|
161
|
+
throw new Error('Token ID must be 1-50 alphanumeric characters (including _ and -)');
|
|
162
|
+
}
|
|
163
|
+
if (metadata && metadata.length > 2000) {
|
|
164
|
+
throw new Error('Metadata must be 2000 characters or less');
|
|
165
|
+
}
|
|
166
|
+
if (attributes && attributes.length > 1000) {
|
|
167
|
+
throw new Error('Attributes must be 1000 characters or less');
|
|
168
|
+
}
|
|
169
|
+
if (collectionData.max_supply && collectionData.current_supply >= collectionData.max_supply) {
|
|
170
|
+
throw new Error('Collection has reached maximum supply');
|
|
171
|
+
}
|
|
172
|
+
const existingToken = await this.adapter.query('SELECT token_id FROM nft_tokens WHERE token_id = ? AND collection_symbol = ?', [tokenId, collectionSymbol]);
|
|
173
|
+
if (existingToken && existingToken.length > 0) {
|
|
174
|
+
throw new Error(`Token ${tokenId} already exists in collection ${collectionSymbol}`);
|
|
175
|
+
}
|
|
176
|
+
await this.adapter.query(`
|
|
177
|
+
INSERT INTO nft_tokens (token_id, collection_symbol, owner, metadata, attributes, minted_at, minted_by)
|
|
178
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
179
|
+
`, [tokenId, collectionSymbol, to, metadata, attributes, new Date(), sender]);
|
|
180
|
+
await this.adapter.query('UPDATE nft_collections SET current_supply = current_supply + 1 WHERE symbol = ?', [collectionSymbol]);
|
|
181
|
+
await this.adapter.query(`
|
|
182
|
+
INSERT INTO nft_transfers (token_id, collection_symbol, from_account, to_account, transfer_type, block_number, transaction_id, timestamp)
|
|
183
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
184
|
+
`, [tokenId, collectionSymbol, 'null', to, 'mint', this.blockNumber, this.transactionId, new Date()]);
|
|
185
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'mintNFT', payload, {
|
|
186
|
+
action: 'nft_minted',
|
|
187
|
+
data: {
|
|
188
|
+
tokenId,
|
|
189
|
+
collectionSymbol,
|
|
190
|
+
to,
|
|
191
|
+
mintedBy: sender
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
console.log(`[NFTContract] NFT ${tokenId} minted in collection ${collectionSymbol} to ${to}`);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error('[NFTContract] Error minting NFT:', error);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async updateNFT(payload, { sender }) {
|
|
202
|
+
try {
|
|
203
|
+
const { collectionSymbol, tokenId, metadata, attributes } = payload;
|
|
204
|
+
const tokenQuery = await this.adapter.query('SELECT * FROM nft_tokens WHERE token_id = ? AND collection_symbol = ? AND burned = FALSE', [tokenId, collectionSymbol]);
|
|
205
|
+
if (!tokenQuery || tokenQuery.length === 0) {
|
|
206
|
+
throw new Error(`Token ${tokenId} does not exist or has been burned`);
|
|
207
|
+
}
|
|
208
|
+
const tokenData = tokenQuery[0];
|
|
209
|
+
const collectionQuery = await this.adapter.query('SELECT * FROM nft_collections WHERE symbol = ?', [collectionSymbol]);
|
|
210
|
+
if (!collectionQuery || collectionQuery.length === 0) {
|
|
211
|
+
throw new Error(`Collection ${collectionSymbol} does not exist`);
|
|
212
|
+
}
|
|
213
|
+
const collectionData = collectionQuery[0];
|
|
214
|
+
if (!collectionData.allow_updates) {
|
|
215
|
+
throw new Error('Updates are not allowed for this collection');
|
|
216
|
+
}
|
|
217
|
+
let canUpdate = false;
|
|
218
|
+
if (collectionData.creator === sender) {
|
|
219
|
+
canUpdate = true;
|
|
220
|
+
}
|
|
221
|
+
else if (collectionData.updateable_by_owner && tokenData.owner === sender) {
|
|
222
|
+
canUpdate = true;
|
|
223
|
+
}
|
|
224
|
+
if (!canUpdate) {
|
|
225
|
+
throw new Error('Only the collection creator or token owner (if allowed) can update the NFT');
|
|
226
|
+
}
|
|
227
|
+
if (metadata && metadata.length > 2000) {
|
|
228
|
+
throw new Error('Metadata must be 2000 characters or less');
|
|
229
|
+
}
|
|
230
|
+
if (attributes && attributes.length > 1000) {
|
|
231
|
+
throw new Error('Attributes must be 1000 characters or less');
|
|
232
|
+
}
|
|
233
|
+
let updateFields = [];
|
|
234
|
+
let updateValues = [];
|
|
235
|
+
if (metadata !== undefined) {
|
|
236
|
+
updateFields.push('metadata = ?');
|
|
237
|
+
updateValues.push(metadata);
|
|
238
|
+
}
|
|
239
|
+
if (attributes !== undefined) {
|
|
240
|
+
updateFields.push('attributes = ?');
|
|
241
|
+
updateValues.push(attributes);
|
|
242
|
+
}
|
|
243
|
+
if (updateFields.length === 0) {
|
|
244
|
+
throw new Error('No update fields provided');
|
|
245
|
+
}
|
|
246
|
+
updateValues.push(tokenId, collectionSymbol);
|
|
247
|
+
await this.adapter.query(`UPDATE nft_tokens SET ${updateFields.join(', ')} WHERE token_id = ? AND collection_symbol = ?`, updateValues);
|
|
248
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'updateNFT', payload, {
|
|
249
|
+
action: 'nft_updated',
|
|
250
|
+
data: {
|
|
251
|
+
tokenId,
|
|
252
|
+
collectionSymbol,
|
|
253
|
+
updatedBy: sender,
|
|
254
|
+
metadata: metadata !== undefined ? metadata : 'unchanged',
|
|
255
|
+
attributes: attributes !== undefined ? attributes : 'unchanged'
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
console.log(`[NFTContract] NFT ${tokenId} updated by ${sender}`);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
console.error('[NFTContract] Error updating NFT:', error);
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async transferNFT(payload, { sender }) {
|
|
266
|
+
try {
|
|
267
|
+
const { collectionSymbol, tokenId, to } = payload;
|
|
268
|
+
const token = await this.adapter.query('SELECT * FROM nft_tokens WHERE token_id = ? AND collection_symbol = ? AND burned = FALSE', [tokenId, collectionSymbol]);
|
|
269
|
+
if (!token || token.length === 0) {
|
|
270
|
+
throw new Error(`Token ${tokenId} does not exist or has been burned`);
|
|
271
|
+
}
|
|
272
|
+
const tokenData = token[0];
|
|
273
|
+
if (tokenData.owner !== sender) {
|
|
274
|
+
throw new Error('Only the token owner can transfer the NFT');
|
|
275
|
+
}
|
|
276
|
+
if (tokenData.owner === to) {
|
|
277
|
+
throw new Error('Cannot transfer to the same address');
|
|
278
|
+
}
|
|
279
|
+
const activeListings = await this.adapter.query('SELECT id FROM nft_listings WHERE token_id = ? AND collection_symbol = ? AND seller = ? AND active = TRUE', [tokenId, collectionSymbol, sender]);
|
|
280
|
+
if (activeListings && activeListings.length > 0) {
|
|
281
|
+
await this.adapter.query('UPDATE nft_listings SET active = FALSE WHERE token_id = ? AND collection_symbol = ? AND seller = ?', [tokenId, collectionSymbol, sender]);
|
|
282
|
+
}
|
|
283
|
+
await this.adapter.query('UPDATE nft_tokens SET owner = ? WHERE token_id = ? AND collection_symbol = ?', [to, tokenId, collectionSymbol]);
|
|
284
|
+
await this.adapter.query(`
|
|
285
|
+
INSERT INTO nft_transfers (token_id, collection_symbol, from_account, to_account, transfer_type, block_number, transaction_id, timestamp)
|
|
286
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
287
|
+
`, [tokenId, collectionSymbol, sender, to, 'transfer', this.blockNumber, this.transactionId, new Date()]);
|
|
288
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'transferNFT', payload, {
|
|
289
|
+
action: 'nft_transferred',
|
|
290
|
+
data: {
|
|
291
|
+
tokenId,
|
|
292
|
+
collectionSymbol,
|
|
293
|
+
from: sender,
|
|
294
|
+
to
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
console.log(`[NFTContract] NFT ${tokenId} transferred from ${sender} to ${to}`);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
console.error('[NFTContract] Error transferring NFT:', error);
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async burnNFT(payload, { sender }) {
|
|
305
|
+
try {
|
|
306
|
+
const { collectionSymbol, tokenId } = payload;
|
|
307
|
+
const token = await this.adapter.query('SELECT * FROM nft_tokens WHERE token_id = ? AND collection_symbol = ? AND burned = FALSE', [tokenId, collectionSymbol]);
|
|
308
|
+
if (!token || token.length === 0) {
|
|
309
|
+
throw new Error(`Token ${tokenId} does not exist or has already been burned`);
|
|
310
|
+
}
|
|
311
|
+
const tokenData = token[0];
|
|
312
|
+
if (tokenData.owner !== sender) {
|
|
313
|
+
throw new Error('Only the token owner can burn the NFT');
|
|
314
|
+
}
|
|
315
|
+
await this.adapter.query('UPDATE nft_listings SET active = FALSE WHERE token_id = ? AND collection_symbol = ?', [tokenId, collectionSymbol]);
|
|
316
|
+
await this.adapter.query('UPDATE nft_tokens SET burned = TRUE WHERE token_id = ? AND collection_symbol = ?', [tokenId, collectionSymbol]);
|
|
317
|
+
await this.adapter.query('UPDATE nft_collections SET current_supply = current_supply - 1 WHERE symbol = ?', [collectionSymbol]);
|
|
318
|
+
await this.adapter.query(`
|
|
319
|
+
INSERT INTO nft_transfers (token_id, collection_symbol, from_account, to_account, transfer_type, block_number, transaction_id, timestamp)
|
|
320
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
321
|
+
`, [tokenId, collectionSymbol, sender, 'null', 'burn', this.blockNumber, this.transactionId, new Date()]);
|
|
322
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'burnNFT', payload, {
|
|
323
|
+
action: 'nft_burned',
|
|
324
|
+
data: {
|
|
325
|
+
tokenId,
|
|
326
|
+
collectionSymbol,
|
|
327
|
+
burnedBy: sender
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
console.log(`[NFTContract] NFT ${tokenId} burned by ${sender}`);
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
console.error('[NFTContract] Error burning NFT:', error);
|
|
334
|
+
throw error;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
async listNFT(payload, { sender }) {
|
|
338
|
+
try {
|
|
339
|
+
const { collectionSymbol, tokenId, price, currency = 'HIVE' } = payload;
|
|
340
|
+
const token = await this.adapter.query('SELECT * FROM nft_tokens WHERE token_id = ? AND collection_symbol = ? AND burned = FALSE', [tokenId, collectionSymbol]);
|
|
341
|
+
if (!token || token.length === 0) {
|
|
342
|
+
throw new Error(`Token ${tokenId} does not exist or has been burned`);
|
|
343
|
+
}
|
|
344
|
+
const tokenData = token[0];
|
|
345
|
+
if (tokenData.owner !== sender) {
|
|
346
|
+
throw new Error('Only the token owner can list the NFT');
|
|
347
|
+
}
|
|
348
|
+
const priceBN = new bignumber_js_1.default(price);
|
|
349
|
+
if (priceBN.isNaN() || priceBN.lte(0)) {
|
|
350
|
+
throw new Error('Price must be a positive number');
|
|
351
|
+
}
|
|
352
|
+
if (!['HIVE', 'HBD'].includes(currency)) {
|
|
353
|
+
throw new Error('Currency must be HIVE or HBD');
|
|
354
|
+
}
|
|
355
|
+
await this.adapter.query('UPDATE nft_listings SET active = FALSE WHERE token_id = ? AND collection_symbol = ? AND seller = ?', [tokenId, collectionSymbol, sender]);
|
|
356
|
+
await this.adapter.query(`
|
|
357
|
+
INSERT INTO nft_listings (token_id, collection_symbol, seller, price, currency, listed_at)
|
|
358
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
359
|
+
`, [tokenId, collectionSymbol, sender, price, currency, new Date()]);
|
|
360
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'listNFT', payload, {
|
|
361
|
+
action: 'nft_listed',
|
|
362
|
+
data: {
|
|
363
|
+
tokenId,
|
|
364
|
+
collectionSymbol,
|
|
365
|
+
seller: sender,
|
|
366
|
+
price,
|
|
367
|
+
currency
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
console.log(`[NFTContract] NFT ${tokenId} listed by ${sender} for ${price} ${currency}`);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
console.error('[NFTContract] Error listing NFT:', error);
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async unlistNFT(payload, { sender }) {
|
|
378
|
+
try {
|
|
379
|
+
const { collectionSymbol, tokenId } = payload;
|
|
380
|
+
const listing = await this.adapter.query('SELECT * FROM nft_listings WHERE token_id = ? AND collection_symbol = ? AND seller = ? AND active = TRUE', [tokenId, collectionSymbol, sender]);
|
|
381
|
+
if (!listing || listing.length === 0) {
|
|
382
|
+
throw new Error(`No active listing found for token ${tokenId}`);
|
|
383
|
+
}
|
|
384
|
+
await this.adapter.query('UPDATE nft_listings SET active = FALSE WHERE token_id = ? AND collection_symbol = ? AND seller = ?', [tokenId, collectionSymbol, sender]);
|
|
385
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'unlistNFT', payload, {
|
|
386
|
+
action: 'nft_unlisted',
|
|
387
|
+
data: {
|
|
388
|
+
tokenId,
|
|
389
|
+
collectionSymbol,
|
|
390
|
+
seller: sender
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
console.log(`[NFTContract] NFT ${tokenId} unlisted by ${sender}`);
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
console.error('[NFTContract] Error unlisting NFT:', error);
|
|
397
|
+
throw error;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async buyNFT(payload, { sender, amount, asset }) {
|
|
401
|
+
try {
|
|
402
|
+
const { collectionSymbol, tokenId } = payload;
|
|
403
|
+
const listing = await this.adapter.query('SELECT * FROM nft_listings WHERE token_id = ? AND collection_symbol = ? AND active = TRUE', [tokenId, collectionSymbol]);
|
|
404
|
+
if (!listing || listing.length === 0) {
|
|
405
|
+
throw new Error(`No active listing found for token ${tokenId}`);
|
|
406
|
+
}
|
|
407
|
+
const listingData = listing[0];
|
|
408
|
+
if (listingData.seller === sender) {
|
|
409
|
+
throw new Error('Cannot buy your own NFT');
|
|
410
|
+
}
|
|
411
|
+
const requiredPrice = new bignumber_js_1.default(listingData.price);
|
|
412
|
+
const paidAmount = new bignumber_js_1.default(amount);
|
|
413
|
+
if (!paidAmount.eq(requiredPrice)) {
|
|
414
|
+
throw new Error(`Incorrect payment amount. Required: ${listingData.price} ${listingData.currency}`);
|
|
415
|
+
}
|
|
416
|
+
if (asset !== listingData.currency) {
|
|
417
|
+
throw new Error(`Incorrect currency. Required: ${listingData.currency}`);
|
|
418
|
+
}
|
|
419
|
+
const collection = await this.adapter.query('SELECT royalty, creator FROM nft_collections WHERE symbol = ?', [collectionSymbol]);
|
|
420
|
+
let royaltyAmount = new bignumber_js_1.default(0);
|
|
421
|
+
let sellerAmount = paidAmount;
|
|
422
|
+
if (collection && collection.length > 0 && collection[0].royalty > 0) {
|
|
423
|
+
royaltyAmount = paidAmount.multipliedBy(collection[0].royalty);
|
|
424
|
+
sellerAmount = paidAmount.minus(royaltyAmount);
|
|
425
|
+
if (royaltyAmount.gt(0) && collection[0].creator !== listingData.seller) {
|
|
426
|
+
console.log(`[NFTContract] Royalty payment: ${royaltyAmount.toFixed(3)} ${asset} to ${collection[0].creator}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
await this.adapter.query('UPDATE nft_tokens SET owner = ? WHERE token_id = ? AND collection_symbol = ?', [sender, tokenId, collectionSymbol]);
|
|
430
|
+
await this.adapter.query('UPDATE nft_listings SET active = FALSE WHERE token_id = ? AND collection_symbol = ?', [tokenId, collectionSymbol]);
|
|
431
|
+
await this.adapter.query(`
|
|
432
|
+
INSERT INTO nft_transfers (token_id, collection_symbol, from_account, to_account, transfer_type, price, currency, block_number, transaction_id, timestamp)
|
|
433
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
434
|
+
`, [tokenId, collectionSymbol, listingData.seller, sender, 'sale', amount, asset, this.blockNumber, this.transactionId, new Date()]);
|
|
435
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'buyNFT', payload, {
|
|
436
|
+
action: 'nft_sold',
|
|
437
|
+
data: {
|
|
438
|
+
tokenId,
|
|
439
|
+
collectionSymbol,
|
|
440
|
+
seller: listingData.seller,
|
|
441
|
+
buyer: sender,
|
|
442
|
+
price: amount,
|
|
443
|
+
currency: asset,
|
|
444
|
+
royaltyAmount: royaltyAmount.toFixed(3),
|
|
445
|
+
sellerAmount: sellerAmount.toFixed(3)
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
console.log(`[NFTContract] NFT ${tokenId} sold to ${sender} for ${amount} ${asset}`);
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
console.error('[NFTContract] Error buying NFT:', error);
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
async getTokenInfo(payload, { sender }) {
|
|
456
|
+
try {
|
|
457
|
+
const { collectionSymbol, tokenId } = payload;
|
|
458
|
+
const token = await this.adapter.query('SELECT * FROM nft_tokens WHERE token_id = ? AND collection_symbol = ?', [tokenId, collectionSymbol]);
|
|
459
|
+
if (!token || token.length === 0) {
|
|
460
|
+
throw new Error(`Token ${tokenId} does not exist in collection ${collectionSymbol}`);
|
|
461
|
+
}
|
|
462
|
+
const tokenData = token[0];
|
|
463
|
+
const listing = await this.adapter.query('SELECT * FROM nft_listings WHERE token_id = ? AND collection_symbol = ? AND active = TRUE', [tokenId, collectionSymbol]);
|
|
464
|
+
const listingData = listing && listing.length > 0 ? listing[0] : null;
|
|
465
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'getTokenInfo', payload, {
|
|
466
|
+
action: 'token_info_query',
|
|
467
|
+
data: {
|
|
468
|
+
tokenId,
|
|
469
|
+
collectionSymbol,
|
|
470
|
+
queried_by: sender,
|
|
471
|
+
token_info: tokenData,
|
|
472
|
+
listing_info: listingData
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
console.log(`[NFTContract] Token info query for ${tokenId} by ${sender}`);
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error('[NFTContract] Error getting token info:', error);
|
|
479
|
+
throw error;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
async getCollectionInfo(payload, { sender }) {
|
|
483
|
+
try {
|
|
484
|
+
const { symbol } = payload;
|
|
485
|
+
const collection = await this.adapter.query('SELECT * FROM nft_collections WHERE symbol = ?', [symbol]);
|
|
486
|
+
if (!collection || collection.length === 0) {
|
|
487
|
+
throw new Error(`Collection ${symbol} does not exist`);
|
|
488
|
+
}
|
|
489
|
+
const collectionData = collection[0];
|
|
490
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'getCollectionInfo', payload, {
|
|
491
|
+
action: 'collection_info_query',
|
|
492
|
+
data: {
|
|
493
|
+
symbol,
|
|
494
|
+
queried_by: sender,
|
|
495
|
+
collection_info: collectionData
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
console.log(`[NFTContract] Collection info query for ${symbol} by ${sender}`);
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
console.error('[NFTContract] Error getting collection info:', error);
|
|
502
|
+
throw error;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
async getUserTokens(payload, { sender }) {
|
|
506
|
+
try {
|
|
507
|
+
const { account, collectionSymbol } = payload;
|
|
508
|
+
let query = 'SELECT * FROM nft_tokens WHERE owner = ? AND burned = FALSE';
|
|
509
|
+
let params = [account];
|
|
510
|
+
if (collectionSymbol) {
|
|
511
|
+
query += ' AND collection_symbol = ?';
|
|
512
|
+
params.push(collectionSymbol);
|
|
513
|
+
}
|
|
514
|
+
const tokens = await this.adapter.query(query, params);
|
|
515
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'getUserTokens', payload, {
|
|
516
|
+
action: 'user_tokens_query',
|
|
517
|
+
data: {
|
|
518
|
+
account,
|
|
519
|
+
collectionSymbol,
|
|
520
|
+
queried_by: sender,
|
|
521
|
+
token_count: tokens ? tokens.length : 0
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
console.log(`[NFTContract] User tokens query for ${account} by ${sender}`);
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
console.error('[NFTContract] Error getting user tokens:', error);
|
|
528
|
+
throw error;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
exports.NFTContract = NFTContract;
|
|
533
|
+
//# sourceMappingURL=nft.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nft.contract.js","sourceRoot":"","sources":["../../src/contracts/nft.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Streamer } from '../streamer';
|
|
2
|
+
export declare class TokenContract {
|
|
3
|
+
_instance: Streamer;
|
|
4
|
+
private adapter;
|
|
5
|
+
private blockNumber;
|
|
6
|
+
private blockId;
|
|
7
|
+
private previousBlockId;
|
|
8
|
+
private transactionId;
|
|
9
|
+
create(): void;
|
|
10
|
+
destroy(): void;
|
|
11
|
+
updateBlockInfo(blockNumber: number, blockId: string, previousBlockId: string, transactionId: string): void;
|
|
12
|
+
private initializeTokenTables;
|
|
13
|
+
private createToken;
|
|
14
|
+
private issueTokens;
|
|
15
|
+
private transferTokens;
|
|
16
|
+
private getBalance;
|
|
17
|
+
private getTokenInfo;
|
|
18
|
+
}
|