@helios-lang/effect 0.1.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/LICENSE +28 -0
- package/README.md +3 -0
- package/dist/Address.js +13 -0
- package/dist/Address.js.map +1 -0
- package/dist/Bech32.js +153 -0
- package/dist/Bech32.js.map +1 -0
- package/dist/Cbor.js +1171 -0
- package/dist/Cbor.js.map +1 -0
- package/dist/Uplc/Cek.js +3 -0
- package/dist/Uplc/Cek.js.map +1 -0
- package/dist/Uplc/Data.js +171 -0
- package/dist/Uplc/Data.js.map +1 -0
- package/dist/Uplc/DataSchema.js +118 -0
- package/dist/Uplc/DataSchema.js.map +1 -0
- package/dist/Uplc/Primitive.js +23 -0
- package/dist/Uplc/Primitive.js.map +1 -0
- package/dist/Uplc/index.js +4 -0
- package/dist/Uplc/index.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Base32.js +201 -0
- package/dist/internal/Base32.js.map +1 -0
- package/dist/internal/BigEndian.js +56 -0
- package/dist/internal/BigEndian.js.map +1 -0
- package/dist/internal/Bits.js +300 -0
- package/dist/internal/Bits.js.map +1 -0
- package/dist/internal/Bytes.js +293 -0
- package/dist/internal/Bytes.js.map +1 -0
- package/dist/internal/Flat.js +298 -0
- package/dist/internal/Flat.js.map +1 -0
- package/dist/internal/Float.js +154 -0
- package/dist/internal/Float.js.map +1 -0
- package/dist/internal/Utf8.js +44 -0
- package/dist/internal/Utf8.js.map +1 -0
- package/eslint.config.mjs +30 -0
- package/package.json +36 -0
- package/src/Address.ts +20 -0
- package/src/Bech32.test.ts +117 -0
- package/src/Bech32.ts +198 -0
- package/src/Cbor.test.ts +1610 -0
- package/src/Cbor.ts +1704 -0
- package/src/Uplc/Cek.ts +92 -0
- package/src/Uplc/Data.ts +259 -0
- package/src/Uplc/DataSchema.test.ts +207 -0
- package/src/Uplc/DataSchema.ts +181 -0
- package/src/Uplc/Primitive.ts +56 -0
- package/src/Uplc/index.ts +3 -0
- package/src/index.ts +4 -0
- package/src/internal/Base32.test.ts +219 -0
- package/src/internal/Base32.ts +341 -0
- package/src/internal/BigEndian.test.ts +79 -0
- package/src/internal/BigEndian.ts +67 -0
- package/src/internal/Bits.test.ts +300 -0
- package/src/internal/Bits.ts +398 -0
- package/src/internal/Bytes.test.ts +369 -0
- package/src/internal/Bytes.ts +343 -0
- package/src/internal/Flat.test.ts +29 -0
- package/src/internal/Flat.ts +387 -0
- package/src/internal/Float.test.ts +51 -0
- package/src/internal/Float.ts +190 -0
- package/src/internal/Utf8.test.ts +69 -0
- package/src/internal/Utf8.ts +58 -0
- package/tsconfig.build.json +14 -0
- package/tsconfig.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025, Helios-Lang
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
ADDED
package/dist/Address.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import * as Bech32 from "./Bech32.js";
|
|
3
|
+
export function isValid(addr) {
|
|
4
|
+
if (addr.startsWith("addr1") || addr.startsWith("addr_test1")) {
|
|
5
|
+
return Bech32.isValid(addr);
|
|
6
|
+
}
|
|
7
|
+
// TODO: validate Byron format
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
export const Address = Schema.String.pipe(Schema.filter((addr) => {
|
|
11
|
+
return isValid(addr) || "Invalid Cardano Address";
|
|
12
|
+
}), Schema.brand("Address"));
|
|
13
|
+
//# sourceMappingURL=Address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Address.js","sourceRoot":"","sources":["../src/Address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,8BAA8B;IAE9B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CACvC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;IAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAA;AACnD,CAAC,CAAC,EACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CACxB,CAAA"}
|
package/dist/Bech32.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Either, Encoding } from "effect";
|
|
2
|
+
import * as Base32 from "./internal/Base32.js";
|
|
3
|
+
/**
|
|
4
|
+
* Bech32 base32 alphabet
|
|
5
|
+
*/
|
|
6
|
+
const ALPHABET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
|
|
7
|
+
const PAYLOAD_CODEC = /* @__PURE__ */ Base32.make({
|
|
8
|
+
alphabet: ALPHABET
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Decomposes a Bech32 checksummed string (eg. a Cardano address), and returns the human readable part and the original bytes
|
|
12
|
+
* Throws an error if checksum is invalid.
|
|
13
|
+
* @param encoded
|
|
14
|
+
* @returns
|
|
15
|
+
* `prefix` part is the human-readable part, `bytes` part is a list containing the underlying bytes.
|
|
16
|
+
*/
|
|
17
|
+
export function decode(encoded) {
|
|
18
|
+
const [prefix, payload] = split(encoded);
|
|
19
|
+
if (!verifySplit(prefix, payload)) {
|
|
20
|
+
return Either.left(Encoding.DecodeException(encoded, "invalid bech32 encoding"));
|
|
21
|
+
}
|
|
22
|
+
const bytes = PAYLOAD_CODEC.decode(payload.slice(0, payload.length - 6));
|
|
23
|
+
if (bytes._tag == "Left") {
|
|
24
|
+
return Either.left(bytes.left);
|
|
25
|
+
}
|
|
26
|
+
return Either.right({ prefix, bytes: Array.from(bytes.right) });
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a Bech32 checksummed string (eg. used to represent Cardano addresses).
|
|
30
|
+
* @param prefix
|
|
31
|
+
* human-readable part (eg. "addr")
|
|
32
|
+
* @param payload
|
|
33
|
+
* Hex encoded or a list of uint8 bytes
|
|
34
|
+
* @returns
|
|
35
|
+
* @throws
|
|
36
|
+
* If prefix is empty
|
|
37
|
+
*/
|
|
38
|
+
export function encode(prefix, payload) {
|
|
39
|
+
if (prefix.length == 0) {
|
|
40
|
+
throw new Error("human-readable-part must have non-zero length");
|
|
41
|
+
}
|
|
42
|
+
payload = PAYLOAD_CODEC.encodeRaw(payload);
|
|
43
|
+
const chkSum = calcChecksum(prefix, payload);
|
|
44
|
+
return (prefix +
|
|
45
|
+
"1" +
|
|
46
|
+
payload
|
|
47
|
+
.concat(chkSum)
|
|
48
|
+
.map((i) => ALPHABET[i])
|
|
49
|
+
.join(""));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Verifies a Bech32 checksum. Prefix must be checked externally
|
|
53
|
+
* @param {string} encoded
|
|
54
|
+
* @returns {boolean}
|
|
55
|
+
*/
|
|
56
|
+
export function isValid(encoded) {
|
|
57
|
+
const [prefix, payload] = split(encoded);
|
|
58
|
+
return verifySplit(prefix, payload);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Expand human readable prefix of the bech32 encoding so it can be used in the checkSum.
|
|
62
|
+
* @param prefix
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
function expandPrefix(prefix) {
|
|
66
|
+
const bytes = [];
|
|
67
|
+
for (const c of prefix) {
|
|
68
|
+
bytes.push(c.charCodeAt(0) >> 5);
|
|
69
|
+
}
|
|
70
|
+
bytes.push(0);
|
|
71
|
+
for (const c of prefix) {
|
|
72
|
+
bytes.push(c.charCodeAt(0) & 31);
|
|
73
|
+
}
|
|
74
|
+
return bytes;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Split bech32 encoded string into human-readable-part and payload part.
|
|
78
|
+
* @param encoded
|
|
79
|
+
* @returns
|
|
80
|
+
* First item is human-readable-part, second part is payload part
|
|
81
|
+
*/
|
|
82
|
+
function split(encoded) {
|
|
83
|
+
const i = encoded.indexOf("1");
|
|
84
|
+
if (i == -1 || i == 0) {
|
|
85
|
+
return ["", encoded];
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return [encoded.slice(0, i), encoded.slice(i + 1)];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Used as part of the bech32 checksum.
|
|
93
|
+
* @param bytes
|
|
94
|
+
* @returns
|
|
95
|
+
*/
|
|
96
|
+
function polymod(bytes) {
|
|
97
|
+
const GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
|
98
|
+
let chk = 1;
|
|
99
|
+
for (const b of bytes) {
|
|
100
|
+
const c = chk >> 25;
|
|
101
|
+
chk = ((chk & 0x1fffffff) << 5) ^ b;
|
|
102
|
+
for (let i = 0; i < 5; i++) {
|
|
103
|
+
if (((c >> i) & 1) != 0) {
|
|
104
|
+
chk ^= GEN[i];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return chk;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate the bech32 checksum.
|
|
112
|
+
* @param prefix
|
|
113
|
+
* @param payload
|
|
114
|
+
* numbers between 0 and 32
|
|
115
|
+
* @returns
|
|
116
|
+
* 6 numbers between 0 and 32
|
|
117
|
+
*/
|
|
118
|
+
function calcChecksum(prefix, payload) {
|
|
119
|
+
const bytes = expandPrefix(prefix).concat(payload);
|
|
120
|
+
const chk = polymod(bytes.concat([0, 0, 0, 0, 0, 0])) ^ 1;
|
|
121
|
+
const chkSum = [];
|
|
122
|
+
for (let i = 0; i < 6; i++) {
|
|
123
|
+
chkSum.push((chk >> (5 * (5 - i))) & 31);
|
|
124
|
+
}
|
|
125
|
+
return chkSum;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* @param prefix
|
|
129
|
+
* @param payload
|
|
130
|
+
* @returns
|
|
131
|
+
*/
|
|
132
|
+
function verifySplit(prefix, payload) {
|
|
133
|
+
if (prefix.length == 0) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const data = [];
|
|
137
|
+
for (const c of payload) {
|
|
138
|
+
const j = ALPHABET.indexOf(c);
|
|
139
|
+
if (j == -1) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
data.push(j);
|
|
143
|
+
}
|
|
144
|
+
const chkSumA = data.slice(data.length - 6);
|
|
145
|
+
const chkSumB = calcChecksum(prefix, data.slice(0, data.length - 6));
|
|
146
|
+
for (let j = 0; j < 6; j++) {
|
|
147
|
+
if (chkSumA[j] != chkSumB[j]) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=Bech32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bech32.js","sourceRoot":"","sources":["../src/Bech32.ts"],"names":[],"mappings":"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"}
|