@trufnetwork/sdk-js 0.2.2 → 0.3.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/README.md +91 -13
- package/dist/cjs/client/client.cjs +41 -32
- package/dist/cjs/client/client.cjs.map +2 -2
- package/dist/cjs/client/getLastTransactions.cjs +67 -0
- package/dist/cjs/client/getLastTransactions.cjs.map +7 -0
- package/dist/cjs/client/listStreams.cjs +46 -0
- package/dist/cjs/client/listStreams.cjs.map +7 -0
- package/dist/cjs/contracts-api/{stream.cjs → action.cjs} +140 -159
- package/dist/cjs/contracts-api/action.cjs.map +7 -0
- package/dist/cjs/contracts-api/composedAction.cjs +183 -0
- package/dist/cjs/contracts-api/composedAction.cjs.map +7 -0
- package/dist/cjs/contracts-api/{destroyStream.cjs → deleteStream.cjs} +16 -16
- package/dist/cjs/contracts-api/deleteStream.cjs.map +7 -0
- package/dist/cjs/contracts-api/deployStream.cjs +33 -16
- package/dist/cjs/contracts-api/deployStream.cjs.map +3 -3
- package/dist/cjs/contracts-api/primitiveAction.cjs +92 -0
- package/dist/cjs/contracts-api/primitiveAction.cjs.map +7 -0
- package/dist/cjs/index.common.cjs +6 -6
- package/dist/cjs/index.common.cjs.map +1 -1
- package/dist/cjs/types/transaction.cjs +19 -0
- package/dist/cjs/types/transaction.cjs.map +7 -0
- package/dist/cjs/util/EthereumAddress.cjs +0 -1
- package/dist/cjs/util/EthereumAddress.cjs.map +2 -2
- package/dist/cjs/util/StreamId.cjs +7 -2
- package/dist/cjs/util/StreamId.cjs.map +2 -2
- package/dist/esm/client/client.mjs +41 -32
- package/dist/esm/client/client.mjs.map +2 -2
- package/dist/esm/client/getLastTransactions.mjs +46 -0
- package/dist/esm/client/getLastTransactions.mjs.map +7 -0
- package/dist/esm/client/listStreams.mjs +25 -0
- package/dist/esm/client/listStreams.mjs.map +7 -0
- package/dist/esm/contracts-api/{stream.mjs → action.mjs} +137 -156
- package/dist/esm/contracts-api/action.mjs.map +7 -0
- package/dist/esm/contracts-api/composedAction.mjs +156 -0
- package/dist/esm/contracts-api/composedAction.mjs.map +7 -0
- package/dist/esm/contracts-api/deleteStream.mjs +24 -0
- package/dist/esm/contracts-api/deleteStream.mjs.map +7 -0
- package/dist/esm/contracts-api/deployStream.mjs +23 -21
- package/dist/esm/contracts-api/deployStream.mjs.map +2 -2
- package/dist/esm/contracts-api/primitiveAction.mjs +71 -0
- package/dist/esm/contracts-api/primitiveAction.mjs.map +7 -0
- package/dist/esm/index.common.mjs +6 -6
- package/dist/esm/index.common.mjs.map +1 -1
- package/dist/esm/types/transaction.mjs +1 -0
- package/dist/esm/types/transaction.mjs.map +7 -0
- package/dist/esm/util/EthereumAddress.mjs +0 -1
- package/dist/esm/util/EthereumAddress.mjs.map +2 -2
- package/dist/esm/util/StreamId.mjs +7 -2
- package/dist/esm/util/StreamId.mjs.map +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/client/client.d.ts +38 -15
- package/dist/types/client/client.d.ts.map +1 -1
- package/dist/types/client/getLastTransactions.d.ts +5 -0
- package/dist/types/client/getLastTransactions.d.ts.map +1 -0
- package/dist/types/client/listStreams.d.ts +12 -0
- package/dist/types/client/listStreams.d.ts.map +1 -0
- package/dist/types/contracts-api/action.d.ts +136 -0
- package/dist/types/contracts-api/action.d.ts.map +1 -0
- package/dist/types/contracts-api/{composedStream.d.ts → composedAction.d.ts} +11 -22
- package/dist/types/contracts-api/composedAction.d.ts.map +1 -0
- package/dist/types/contracts-api/{destroyStream.d.ts → deleteStream.d.ts} +7 -7
- package/dist/types/contracts-api/deleteStream.d.ts.map +1 -0
- package/dist/types/contracts-api/deployStream.d.ts +2 -2
- package/dist/types/contracts-api/deployStream.d.ts.map +1 -1
- package/dist/types/contracts-api/primitiveAction.d.ts +33 -0
- package/dist/types/contracts-api/primitiveAction.d.ts.map +1 -0
- package/dist/types/index.common.d.ts +7 -7
- package/dist/types/types/transaction.d.ts +11 -0
- package/dist/types/types/transaction.d.ts.map +1 -0
- package/dist/types/util/EthereumAddress.d.ts.map +1 -1
- package/dist/types/util/StreamId.d.ts +2 -0
- package/dist/types/util/StreamId.d.ts.map +1 -1
- package/dist/types/util/visibility.d.ts.map +1 -1
- package/package.json +10 -6
- package/dist/cjs/client/listAllStreams.cjs +0 -51
- package/dist/cjs/client/listAllStreams.cjs.map +0 -7
- package/dist/cjs/contracts/composed_stream_template.json +0 -1638
- package/dist/cjs/contracts/composed_stream_template_unix.json +0 -2122
- package/dist/cjs/contracts/contractsContent.cjs +0 -65
- package/dist/cjs/contracts/contractsContent.cjs.map +0 -7
- package/dist/cjs/contracts/primitive_stream_template.json +0 -952
- package/dist/cjs/contracts/primitive_stream_template_unix.json +0 -1173
- package/dist/cjs/contracts-api/composedStream.cjs +0 -137
- package/dist/cjs/contracts-api/composedStream.cjs.map +0 -7
- package/dist/cjs/contracts-api/destroyStream.cjs.map +0 -7
- package/dist/cjs/contracts-api/primitiveStream.cjs +0 -86
- package/dist/cjs/contracts-api/primitiveStream.cjs.map +0 -7
- package/dist/cjs/contracts-api/stream.cjs.map +0 -7
- package/dist/esm/client/listAllStreams.mjs +0 -30
- package/dist/esm/client/listAllStreams.mjs.map +0 -7
- package/dist/esm/contracts/composed_stream_template.json +0 -1638
- package/dist/esm/contracts/composed_stream_template_unix.json +0 -2122
- package/dist/esm/contracts/contractsContent.mjs +0 -33
- package/dist/esm/contracts/contractsContent.mjs.map +0 -7
- package/dist/esm/contracts/primitive_stream_template.json +0 -952
- package/dist/esm/contracts/primitive_stream_template_unix.json +0 -1173
- package/dist/esm/contracts-api/composedStream.mjs +0 -116
- package/dist/esm/contracts-api/composedStream.mjs.map +0 -7
- package/dist/esm/contracts-api/destroyStream.mjs +0 -24
- package/dist/esm/contracts-api/destroyStream.mjs.map +0 -7
- package/dist/esm/contracts-api/primitiveStream.mjs +0 -65
- package/dist/esm/contracts-api/primitiveStream.mjs.map +0 -7
- package/dist/esm/contracts-api/stream.mjs.map +0 -7
- package/dist/types/client/listAllStreams.d.ts +0 -14
- package/dist/types/client/listAllStreams.d.ts.map +0 -1
- package/dist/types/contracts/contractsContent.d.ts +0 -6
- package/dist/types/contracts/contractsContent.d.ts.map +0 -1
- package/dist/types/contracts-api/composedStream.d.ts.map +0 -1
- package/dist/types/contracts-api/destroyStream.d.ts.map +0 -1
- package/dist/types/contracts-api/primitiveStream.d.ts +0 -39
- package/dist/types/contracts-api/primitiveStream.d.ts.map +0 -1
- package/dist/types/contracts-api/stream.d.ts +0 -142
- package/dist/types/contracts-api/stream.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/StreamId.ts"],
|
|
4
|
-
"sourcesContent": ["import { sha256 } from \"crypto-hash\";\nimport { Either } from \"monads-io\";\n\nexport class StreamId {\n private readonly id: string;\n private readonly correctlyCreated: boolean = false;\n\n private constructor(id: string) {\n this.id = id;\n this.correctlyCreated = true;\n }\n\n public getId(): string {\n if (!this.correctlyCreated) {\n throw new Error(\"StreamId not correctly created\");\n }\n\n return this.id;\n }\n\n public validate(): boolean {\n return this.id.length === 32 && this.id.startsWith(\"st\");\n }\n\n public toJSON(): string {\n return this.getId();\n }\n\n public static fromJSON(json: string): StreamId {\n return new StreamId(json);\n }\n\n public static async generate(s: string): Promise<StreamId> {\n // If the string is already a valid StreamId, return it\n if (s.length === 32 && s.startsWith(\"st\")) {\n return new StreamId(s);\n }\n\n // Compute SHA-256 hash of the input string\n const hash = await sha256(s);\n\n // Take the first 30 characters of the hash and prepend \"st\"\n const streamIdStr = \"st\" + hash.slice(0, 30);\n\n return new StreamId(streamIdStr);\n }\n\n public static fromString(s: string): Either<Error, StreamId> {\n try {\n return Either.right(new StreamId(s));\n } catch (e) {\n return Either.left(e as Error);\n }\n }\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n describe(\"StreamId\", () => {\n it(\"should generate a valid StreamId\", async () => {\n const streamId = await StreamId.generate(\"cpi_india_1.1.01\");\n expect(streamId.validate()).toBe(true);\n expect(streamId.getId()).toBe(\"st39830c44932bc42a3bffef72310948\");\n });\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuB;AACvB,uBAAuB;AADvB;AAGO,IAAM,WAAN,MAAM,UAAS;AAAA,EACH;AAAA,EACA,mBAA4B;AAAA,
|
|
4
|
+
"sourcesContent": ["import { sha256 } from \"crypto-hash\";\nimport { Either } from \"monads-io\";\n\nexport class StreamId {\n private readonly id: string;\n private readonly correctlyCreated: boolean = false;\n private readonly name?: string;\n\n private constructor(id: string, name?: string) {\n this.id = id;\n this.correctlyCreated = true;\n this.name = name;\n }\n\n public getId(): string {\n if (!this.correctlyCreated) {\n throw new Error(\"StreamId not correctly created\");\n }\n\n return this.id;\n }\n\n public getName(): string | undefined {\n return this.name;\n }\n\n public validate(): boolean {\n return this.id.length === 32 && this.id.startsWith(\"st\");\n }\n\n public toJSON(): string {\n return this.getId();\n }\n\n public static fromJSON(json: string): StreamId {\n return new StreamId(json);\n }\n\n public static async generate(s: string): Promise<StreamId> {\n // If the string is already a valid StreamId, return it\n if (s.length === 32 && s.startsWith(\"st\")) {\n return new StreamId(s);\n }\n\n // Compute SHA-256 hash of the input string\n const hash = await sha256(s);\n\n // Take the first 30 characters of the hash and prepend \"st\"\n const streamIdStr = \"st\" + hash.slice(0, 30);\n\n return new StreamId(streamIdStr, s);\n }\n\n public static fromString(s: string): Either<Error, StreamId> {\n try {\n return Either.right(new StreamId(s));\n } catch (e) {\n return Either.left(e as Error);\n }\n }\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n describe(\"StreamId\", () => {\n it(\"should generate a valid StreamId\", async () => {\n const streamId = await StreamId.generate(\"cpi_india_1.1.01\");\n expect(streamId.validate()).toBe(true);\n expect(streamId.getId()).toBe(\"st39830c44932bc42a3bffef72310948\");\n });\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuB;AACvB,uBAAuB;AADvB;AAGO,IAAM,WAAN,MAAM,UAAS;AAAA,EACH;AAAA,EACA,mBAA4B;AAAA,EAC5B;AAAA,EAET,YAAY,IAAY,MAAe;AAC7C,SAAK,KAAK;AACV,SAAK,mBAAmB;AACxB,SAAK,OAAO;AAAA,EACd;AAAA,EAEO,QAAgB;AACrB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAA8B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,WAAoB;AACzB,WAAO,KAAK,GAAG,WAAW,MAAM,KAAK,GAAG,WAAW,IAAI;AAAA,EACzD;AAAA,EAEO,SAAiB;AACtB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,OAAc,SAAS,MAAwB;AAC7C,WAAO,IAAI,UAAS,IAAI;AAAA,EAC1B;AAAA,EAEA,aAAoB,SAAS,GAA8B;AAEzD,QAAI,EAAE,WAAW,MAAM,EAAE,WAAW,IAAI,GAAG;AACzC,aAAO,IAAI,UAAS,CAAC;AAAA,IACvB;AAGA,UAAM,OAAO,UAAM,2BAAO,CAAC;AAG3B,UAAM,cAAc,OAAO,KAAK,MAAM,GAAG,EAAE;AAE3C,WAAO,IAAI,UAAS,aAAa,CAAC;AAAA,EACpC;AAAA,EAEA,OAAc,WAAW,GAAoC;AAC3D,QAAI;AACF,aAAO,wBAAO,MAAM,IAAI,UAAS,CAAC,CAAC;AAAA,IACrC,SAAS,GAAG;AACV,aAAO,wBAAO,KAAK,CAAU;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,IAAI,YAAY,QAAQ;AACtB,QAAM,EAAE,UAAU,IAAI,OAAO,IAAI,YAAY;AAC7C,WAAS,YAAY,MAAM;AACzB,OAAG,oCAAoC,YAAY;AACjD,YAAM,WAAW,MAAM,SAAS,SAAS,kBAAkB;AAC3D,aAAO,SAAS,SAAS,CAAC,EAAE,KAAK,IAAI;AACrC,aAAO,SAAS,MAAM,CAAC,EAAE,KAAK,kCAAkC;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,18 +4,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
4
4
|
|
|
5
5
|
// src/client/client.ts
|
|
6
6
|
import { Client, KwilSigner } from "@kwilteam/kwil-js";
|
|
7
|
-
import {
|
|
7
|
+
import { ComposedAction } from "../contracts-api/composedAction.mjs";
|
|
8
8
|
import { deployStream } from "../contracts-api/deployStream.mjs";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { deleteStream } from "../contracts-api/deleteStream.mjs";
|
|
10
|
+
import { PrimitiveAction } from "../contracts-api/primitiveAction.mjs";
|
|
11
|
+
import { Action } from "../contracts-api/action.mjs";
|
|
12
12
|
import { EthereumAddress } from "../util/EthereumAddress.mjs";
|
|
13
|
-
import {
|
|
13
|
+
import { listStreams } from "./listStreams.mjs";
|
|
14
|
+
import { getLastTransactions } from "./getLastTransactions.mjs";
|
|
14
15
|
var BaseTNClient = class {
|
|
15
16
|
constructor(options) {
|
|
16
17
|
__publicField(this, "kwilClient");
|
|
17
18
|
__publicField(this, "signerInfo");
|
|
19
|
+
__publicField(this, "neonConnectionString");
|
|
18
20
|
this.signerInfo = options.signerInfo;
|
|
21
|
+
this.neonConnectionString = options.neonConnectionString;
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
21
24
|
* Waits for a transaction to be mined by TN.
|
|
@@ -29,14 +32,14 @@ var BaseTNClient = class {
|
|
|
29
32
|
const receipt = await this.getKwilClient()["txInfoClient"](txHash).catch(() => ({ data: void 0, status: void 0 }));
|
|
30
33
|
switch (receipt.status) {
|
|
31
34
|
case 200:
|
|
32
|
-
if (receipt.data?.tx_result
|
|
33
|
-
resolve(receipt.data);
|
|
34
|
-
} else {
|
|
35
|
+
if (receipt.data?.tx_result?.log !== void 0 && receipt.data?.tx_result?.log.includes("ERROR")) {
|
|
35
36
|
reject(
|
|
36
37
|
new Error(
|
|
37
38
|
`Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`
|
|
38
39
|
)
|
|
39
40
|
);
|
|
41
|
+
} else {
|
|
42
|
+
resolve(receipt.data);
|
|
40
43
|
}
|
|
41
44
|
break;
|
|
42
45
|
case void 0:
|
|
@@ -76,6 +79,12 @@ var BaseTNClient = class {
|
|
|
76
79
|
}
|
|
77
80
|
return this.kwilClient;
|
|
78
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Returns the Neon connection string used by the client.
|
|
84
|
+
*/
|
|
85
|
+
getNeonConnectionString() {
|
|
86
|
+
return this.neonConnectionString;
|
|
87
|
+
}
|
|
79
88
|
/**
|
|
80
89
|
* Deploys a new stream.
|
|
81
90
|
* @param streamId - The ID of the stream to deploy.
|
|
@@ -84,25 +93,25 @@ var BaseTNClient = class {
|
|
|
84
93
|
* @param contractVersion
|
|
85
94
|
* @returns A promise that resolves to a generic response containing the transaction receipt.
|
|
86
95
|
*/
|
|
87
|
-
async deployStream(streamId, streamType, synchronous
|
|
96
|
+
async deployStream(streamId, streamType, synchronous) {
|
|
88
97
|
return await deployStream({
|
|
89
98
|
streamId,
|
|
90
99
|
streamType,
|
|
91
100
|
synchronous,
|
|
92
101
|
kwilClient: this.getKwilClient(),
|
|
93
102
|
kwilSigner: this.getKwilSigner(),
|
|
94
|
-
|
|
103
|
+
neonConnectionString: this.getNeonConnectionString()
|
|
95
104
|
});
|
|
96
105
|
}
|
|
97
106
|
/**
|
|
98
107
|
* Destroys a stream.
|
|
99
|
-
* @param
|
|
108
|
+
* @param stream - The StreamLocator of the stream to destroy.
|
|
100
109
|
* @param synchronous - Whether the destruction should be synchronous.
|
|
101
110
|
* @returns A promise that resolves to a generic response containing the transaction receipt.
|
|
102
111
|
*/
|
|
103
|
-
async destroyStream(
|
|
104
|
-
return await
|
|
105
|
-
|
|
112
|
+
async destroyStream(stream, synchronous) {
|
|
113
|
+
return await deleteStream({
|
|
114
|
+
stream,
|
|
106
115
|
synchronous,
|
|
107
116
|
kwilClient: this.getKwilClient(),
|
|
108
117
|
kwilSigner: this.getKwilSigner()
|
|
@@ -110,35 +119,27 @@ var BaseTNClient = class {
|
|
|
110
119
|
}
|
|
111
120
|
/**
|
|
112
121
|
* Loads an already deployed stream, permitting its API usage.
|
|
113
|
-
* @param stream - The locator of the stream to load.
|
|
114
122
|
* @returns An instance of IStream.
|
|
115
123
|
*/
|
|
116
|
-
|
|
117
|
-
return new
|
|
124
|
+
loadAction() {
|
|
125
|
+
return new Action(
|
|
118
126
|
this.getKwilClient(),
|
|
119
|
-
this.getKwilSigner()
|
|
120
|
-
stream
|
|
127
|
+
this.getKwilSigner()
|
|
121
128
|
);
|
|
122
129
|
}
|
|
123
130
|
/**
|
|
124
131
|
* Loads a primitive stream.
|
|
125
|
-
* @param stream - The locator of the primitive stream to load.
|
|
126
132
|
* @returns An instance of IPrimitiveStream.
|
|
127
133
|
*/
|
|
128
|
-
|
|
129
|
-
return
|
|
134
|
+
loadPrimitiveAction() {
|
|
135
|
+
return PrimitiveAction.fromStream(this.loadAction());
|
|
130
136
|
}
|
|
131
137
|
/**
|
|
132
138
|
* Loads a composed stream.
|
|
133
|
-
* @param stream - The locator of the composed stream to load.
|
|
134
139
|
* @returns An instance of IComposedStream.
|
|
135
140
|
*/
|
|
136
|
-
|
|
137
|
-
return
|
|
138
|
-
this.getKwilClient(),
|
|
139
|
-
this.getKwilSigner(),
|
|
140
|
-
stream
|
|
141
|
-
);
|
|
141
|
+
loadComposedAction() {
|
|
142
|
+
return ComposedAction.fromStream(this.loadAction(), this.getNeonConnectionString());
|
|
142
143
|
}
|
|
143
144
|
/**
|
|
144
145
|
* Creates a new stream locator.
|
|
@@ -160,11 +161,19 @@ var BaseTNClient = class {
|
|
|
160
161
|
}
|
|
161
162
|
/**
|
|
162
163
|
* Returns all streams from the TN network.
|
|
163
|
-
* @param
|
|
164
|
+
* @param input - The input parameters for listing streams.
|
|
164
165
|
* @returns A promise that resolves to a list of stream locators.
|
|
165
166
|
*/
|
|
166
|
-
async
|
|
167
|
-
return
|
|
167
|
+
async getListStreams(input) {
|
|
168
|
+
return listStreams(this.getKwilClient(), this.getKwilSigner(), input);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Returns the last write activity across streams.
|
|
172
|
+
* @param input - The input parameters for getting last transactions.
|
|
173
|
+
* @returns A promise that resolves to a list of last transactions.
|
|
174
|
+
*/
|
|
175
|
+
async getLastTransactions(input) {
|
|
176
|
+
return getLastTransactions(this.getKwilClient(), this.getKwilSigner(), input);
|
|
168
177
|
}
|
|
169
178
|
/**
|
|
170
179
|
* Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/client/client.ts"],
|
|
4
|
-
"sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { KwilConfig } from \"@kwilteam/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@kwilteam/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@kwilteam/kwil-js/dist/core/
|
|
5
|
-
"mappings": ";;;;;AAAA,SAAS,QAAQ,kBAAqC;AAQtD,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@kwilteam/kwil-js\";\nimport { KwilConfig } from \"@kwilteam/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@kwilteam/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@kwilteam/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@kwilteam/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@kwilteam/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@kwilteam/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@kwilteam/kwil-js/dist/core/txQuery\";\nimport { ComposedAction } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n neonConnectionString?: string;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n protected neonConnectionString: string | undefined;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n this.neonConnectionString = options.neonConnectionString;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Returns the Neon connection string used by the client.\n */\n getNeonConnectionString(): string | undefined {\n return this.neonConnectionString;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n neonConnectionString: this.getNeonConnectionString(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction(), this.getNeonConnectionString());\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<StreamLocator[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// src/client/getLastTransactions.ts
|
|
2
|
+
var INDEXER_BASE = "https://indexer.infra.truf.network";
|
|
3
|
+
async function getLastTransactions(kwilClient, kwilSigner, input) {
|
|
4
|
+
const res = await kwilClient.call(
|
|
5
|
+
{
|
|
6
|
+
name: "get_last_transactions",
|
|
7
|
+
namespace: "main",
|
|
8
|
+
inputs: {
|
|
9
|
+
$data_provider: input.dataProvider ?? null,
|
|
10
|
+
$limit_size: input.limitSize ?? 6
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
kwilSigner
|
|
14
|
+
);
|
|
15
|
+
const rows = res.data?.result || [];
|
|
16
|
+
return Promise.all(
|
|
17
|
+
rows.map(async (r) => {
|
|
18
|
+
const url = `${INDEXER_BASE}/v0/chain/transactions?from-block=${r.created_at}&to-block=${r.created_at}&order=asc&limit=1`;
|
|
19
|
+
const resp = await fetch(url);
|
|
20
|
+
if (!resp.ok) {
|
|
21
|
+
throw new Error(`Indexer fetch failed: ${resp.status}`);
|
|
22
|
+
}
|
|
23
|
+
const json = await resp.json();
|
|
24
|
+
if (!json.ok || !json.data || json.data.length === 0) {
|
|
25
|
+
console.warn(`No transaction found at block ${r.created_at}`);
|
|
26
|
+
return {
|
|
27
|
+
blockHeight: r.created_at,
|
|
28
|
+
method: r.method,
|
|
29
|
+
sender: "(unknown)",
|
|
30
|
+
transactionHash: "(unknown)"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const tx = json.data[0];
|
|
34
|
+
return {
|
|
35
|
+
blockHeight: r.created_at,
|
|
36
|
+
method: r.method,
|
|
37
|
+
sender: tx.sender,
|
|
38
|
+
transactionHash: tx.hash
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
getLastTransactions
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=getLastTransactions.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/client/getLastTransactions.ts"],
|
|
4
|
+
"sourcesContent": ["import { WebKwil, NodeKwil, KwilSigner } from \"@kwilteam/kwil-js\";\r\nimport { GetLastTransactionsInput } from \"./client\";\r\nimport { LastTransaction } from \"../types/transaction\";\r\n\r\nconst INDEXER_BASE = \"https://indexer.infra.truf.network\";\r\n\r\nexport async function getLastTransactions(\r\n kwilClient: WebKwil | NodeKwil,\r\n kwilSigner: KwilSigner,\r\n input: GetLastTransactionsInput\r\n): Promise<LastTransaction[]> {\r\n // 1) call your SQL action\r\n const res = await kwilClient.call(\r\n {\r\n name: \"get_last_transactions\",\r\n namespace: \"main\",\r\n inputs: {\r\n $data_provider: input.dataProvider ?? null,\r\n $limit_size: input.limitSize ?? 6,\r\n },\r\n },\r\n kwilSigner\r\n );\r\n\r\n const rows =\r\n (res.data?.result as { created_at: number; method: string }[]) || [];\r\n\r\n // 2) for each row, hit the indexer to grab sender & tx hash\r\n return Promise.all(\r\n rows.map(async (r) => {\r\n const url = `${INDEXER_BASE}/v0/chain/transactions`\r\n + `?from-block=${r.created_at}`\r\n + `&to-block=${r.created_at}`\r\n + `&order=asc&limit=1`;\r\n\r\n const resp = await fetch(url);\r\n if (!resp.ok) {\r\n throw new Error(`Indexer fetch failed: ${resp.status}`);\r\n }\r\n const json = await resp.json() as {\r\n ok: boolean;\r\n data: Array<{\r\n hash: string;\r\n sender: string;\r\n }> | null;\r\n };\r\n\r\n if (!json.ok || !json.data || json.data.length === 0) {\r\n console.warn(`No transaction found at block ${r.created_at}`);\r\n return {\r\n blockHeight: r.created_at,\r\n method: r.method,\r\n sender: \"(unknown)\",\r\n transactionHash: \"(unknown)\",\r\n };\r\n }\r\n\r\n const tx = json.data[0];\r\n return {\r\n blockHeight: r.created_at,\r\n method: r.method,\r\n sender: tx.sender,\r\n transactionHash: tx.hash,\r\n };\r\n })\r\n );\r\n}\r\n"],
|
|
5
|
+
"mappings": ";AAIA,IAAM,eAAe;AAErB,eAAsB,oBAClB,YACA,YACA,OAC0B;AAE1B,QAAM,MAAM,MAAM,WAAW;AAAA,IACzB;AAAA,MACI,MAAM;AAAA,MACN,WAAW;AAAA,MACX,QAAQ;AAAA,QACJ,gBAAgB,MAAM,gBAAgB;AAAA,QACtC,aAAa,MAAM,aAAa;AAAA,MACpC;AAAA,IACJ;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,OACD,IAAI,MAAM,UAAuD,CAAC;AAGvE,SAAO,QAAQ;AAAA,IACX,KAAK,IAAI,OAAO,MAAM;AAClB,YAAM,MAAM,GAAG,YAAY,qCACN,EAAE,UAAU,aACd,EAAE,UAAU;AAG/B,YAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,UAAI,CAAC,KAAK,IAAI;AACV,cAAM,IAAI,MAAM,yBAAyB,KAAK,MAAM,EAAE;AAAA,MAC1D;AACA,YAAM,OAAO,MAAM,KAAK,KAAK;AAQ7B,UAAI,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;AAClD,gBAAQ,KAAK,iCAAiC,EAAE,UAAU,EAAE;AAC5D,eAAO;AAAA,UACH,aAAa,EAAE;AAAA,UACf,QAAQ,EAAE;AAAA,UACV,QAAQ;AAAA,UACR,iBAAiB;AAAA,QACrB;AAAA,MACJ;AAEA,YAAM,KAAK,KAAK,KAAK,CAAC;AACtB,aAAO;AAAA,QACH,aAAa,EAAE;AAAA,QACf,QAAQ,EAAE;AAAA,QACV,QAAQ,GAAG;AAAA,QACX,iBAAiB,GAAG;AAAA,MACxB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/client/listStreams.ts
|
|
2
|
+
import { EthereumAddress } from "../util/EthereumAddress.mjs";
|
|
3
|
+
import { StreamId } from "../util/StreamId.mjs";
|
|
4
|
+
async function listStreams(kwilClient, kwilSigner, input) {
|
|
5
|
+
const result = await kwilClient.call({
|
|
6
|
+
inputs: {
|
|
7
|
+
$data_provider: input.dataProvider,
|
|
8
|
+
$limit: input.limit,
|
|
9
|
+
$offset: input.offset,
|
|
10
|
+
$order_by: input.orderBy
|
|
11
|
+
},
|
|
12
|
+
name: "list_streams",
|
|
13
|
+
namespace: "main"
|
|
14
|
+
}, kwilSigner);
|
|
15
|
+
return await Promise.all(
|
|
16
|
+
(result.data?.result).map(async (database) => ({
|
|
17
|
+
streamId: await StreamId.generate(database.stream_id),
|
|
18
|
+
dataProvider: new EthereumAddress(database.data_provider)
|
|
19
|
+
}))
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
listStreams
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=listStreams.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/client/listStreams.ts"],
|
|
4
|
+
"sourcesContent": ["import {StreamLocator} from \"../types/stream\";\nimport {EthereumAddress} from \"../util/EthereumAddress\";\nimport {StreamId} from \"../util/StreamId\";\nimport {Database} from \"@kwilteam/kwil-js/dist/core/database\";\nimport {ListStreamsInput} from \"./client\";\nimport {KwilSigner, NodeKwil, WebKwil} from \"@kwilteam/kwil-js\";\n\n/**\n * List all streams from the TN network.\n * @param kwilClient - The Kwil client.\n * @param kwilSigner - The Kwil signer.\n * @param input - The input parameters for listing streams.\n * @returns A list of stream locators.\n */\nexport async function listStreams(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n input: ListStreamsInput\n): Promise<StreamLocator[]> {\n const result = await kwilClient.call({\n inputs: {\n $data_provider: input.dataProvider,\n $limit: input.limit,\n $offset: input.offset,\n $order_by: input.orderBy,\n },\n name: \"list_streams\",\n namespace: \"main\",\n }, kwilSigner);\n\n return await Promise.all(\n (result.data?.result as {\n data_provider: string;\n stream_id: string;\n stream_type: string;\n created_at: number;\n }[]).map(async (database) => ({\n streamId: await StreamId.generate(database.stream_id),\n dataProvider: new EthereumAddress(database.data_provider),\n }))\n );\n}"],
|
|
5
|
+
"mappings": ";AACA,SAAQ,uBAAsB;AAC9B,SAAQ,gBAAe;AAYvB,eAAsB,YACpB,YACA,YACA,OAC0B;AACxB,QAAM,SAAS,MAAM,WAAW,KAAK;AAAA,IACjC,QAAQ;AAAA,MACJ,gBAAgB,MAAM;AAAA,MACtB,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,EACf,GAAG,UAAU;AAEb,SAAO,MAAM,QAAQ;AAAA,KAChB,OAAO,MAAM,QAKT,IAAI,OAAO,cAAc;AAAA,MAC1B,UAAU,MAAM,SAAS,SAAS,SAAS,SAAS;AAAA,MACpD,cAAc,IAAI,gBAAgB,SAAS,aAAa;AAAA,IAC5D,EAAE;AAAA,EACN;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|