|
1 | | -import * as CML from "@anastasia-labs/cardano-multiplatform-lib-nodejs" |
2 | | -import type { Record, SchemaAST } from "effect" |
3 | 1 | import { pipe, Schema } from "effect" |
4 | 2 | import type { ParseIssue } from "effect/ParseResult" |
5 | 3 |
|
@@ -112,155 +110,3 @@ export const isConstr = Schema.is(Constr) |
112 | 110 |
|
113 | 111 | // export const Data = Schema.Union(Integer, ByteArray, List, Map, Constr); |
114 | 112 | export const Data: Schema.Schema<Data> = Schema.Union(Integer, ByteArray, List, Map, Constr) |
115 | | - |
116 | | -export const mkByteArray = (bytes: string): ByteArray => ByteArray.make({ bytes }) |
117 | | - |
118 | | -export const mkMap = (map: Record<string, Data>): Readonly<Map> => Map.make(map) |
119 | | - |
120 | | -export const mkInteger = (int: number): Integer => Integer.make({ int }) |
121 | | - |
122 | | -// export const mkConstr = <T extends Data>( |
123 | | -// constructor: number, |
124 | | -// fields: readonly T[] |
125 | | -// ): { readonly constructor: number; readonly fields: readonly T[] } => ({ |
126 | | -// constructor, |
127 | | -// fields |
128 | | -// }); |
129 | | -export const mkConstr = <T extends Data>( |
130 | | - constructor: number, |
131 | | - fields: ReadonlyArray<T> |
132 | | -): { readonly constructor: number; readonly fields: ReadonlyArray<T> } => ({ |
133 | | - constructor, |
134 | | - fields |
135 | | -}) |
136 | | -/** |
137 | | - * Converts TypeScript data into CBOR hex string |
138 | | - * |
139 | | - * @since 1.0.0 |
140 | | - */ |
141 | | -export const toCBOR = <Source, Target extends Data>( |
142 | | - input: unknown, |
143 | | - schema?: Schema.Schema<Source, Target>, |
144 | | - options: { |
145 | | - canonical?: boolean |
146 | | - parseOptions?: SchemaAST.ParseOptions |
147 | | - } = {} |
148 | | -): string => { |
149 | | - const { canonical = false } = options |
150 | | - const toCMLPlutusData = (data: Data): CML.PlutusData => { |
151 | | - if (isInteger(data)) { |
152 | | - return CML.PlutusData.new_integer(CML.BigInteger.from_str(data.int.toString())) |
153 | | - } else if (isByteArray(data)) { |
154 | | - return CML.PlutusData.new_bytes(Bytes.Codec.Encode.bytes(data.bytes)) |
155 | | - } else if (isList(data)) { |
156 | | - const list = CML.PlutusDataList.new() |
157 | | - data.forEach((item) => list.add(toCMLPlutusData(item))) |
158 | | - return CML.PlutusData.new_list(list) |
159 | | - } else if (isMap(data)) { |
160 | | - const map = CML.PlutusMap.new() |
161 | | - Object.entries(data).forEach(([key, value]) => { |
162 | | - const plutusKey = CML.PlutusData.new_bytes(Bytes.Codec.Encode.bytes(key)) |
163 | | - map.set(plutusKey, toCMLPlutusData(value)) |
164 | | - }) |
165 | | - return CML.PlutusData.new_map(map) |
166 | | - } else if (isConstr(data)) { |
167 | | - const fields = CML.PlutusDataList.new() |
168 | | - data.fields.forEach((item) => fields.add(toCMLPlutusData(item))) |
169 | | - return CML.PlutusData.new_constr_plutus_data(CML.ConstrPlutusData.new(BigInt(data.constructor), fields)) |
170 | | - } else { |
171 | | - throw new Error(`Unsupported data type: ${data}`) |
172 | | - } |
173 | | - } |
174 | | - |
175 | | - const data: Data = schema ? toData(input, schema, options.parseOptions) : toData(input, Data) |
176 | | - const cmlPlutusData = toCMLPlutusData(data) |
177 | | - return canonical ? cmlPlutusData.to_canonical_cbor_hex() : cmlPlutusData.to_cardano_node_format().to_cbor_hex() |
178 | | -} |
179 | | - |
180 | | -/** |
181 | | - * Decodes a CBOR hex string to a TypeScript type |
182 | | - * |
183 | | - * @since 1.0.0 |
184 | | - */ |
185 | | -export function fromCBOR(input: string): Data |
186 | | -export function fromCBOR<Source, Target extends Data>(input: string, schema: Schema.Schema<Source, Target>): Source |
187 | | -export function fromCBOR<Source, Target extends Data>( |
188 | | - input: string, |
189 | | - schema?: Schema.Schema<Source, Target> |
190 | | -): Source | Data { |
191 | | - const data = resolveCBOR(input) |
192 | | - return schema ? fromData(data, schema) : data |
193 | | -} |
194 | | - |
195 | | -export const resolveCBOR = (input: string): Data => { |
196 | | - let data: CML.PlutusData |
197 | | - try { |
198 | | - data = CML.PlutusData.from_cbor_hex(input) |
199 | | - } catch { |
200 | | - throw new Error(`Failed to resolve CBOR input: ${input}`) |
201 | | - } |
202 | | - switch (data.kind()) { |
203 | | - case CML.PlutusDataKind.Integer: |
204 | | - return Integer.make({ int: Number(data.as_integer()!.to_str()) }) |
205 | | - case CML.PlutusDataKind.Bytes: |
206 | | - return ByteArray.make({ |
207 | | - bytes: Bytes.Codec.Decode.bytes(data.as_bytes()!) |
208 | | - }) |
209 | | - case CML.PlutusDataKind.List: { |
210 | | - const list = data.as_list()! |
211 | | - const array = [] |
212 | | - for (let i = 0; i < list.len(); i++) { |
213 | | - array.push(resolveCBOR(list.get(i).to_cbor_hex())) |
214 | | - } |
215 | | - return array |
216 | | - } |
217 | | - case CML.PlutusDataKind.Map: { |
218 | | - const plutusMap = data.as_map()! |
219 | | - const map: Record<string, Data> = {} |
220 | | - const keys = plutusMap.keys() |
221 | | - for (let i = 0; i < keys.len(); i++) { |
222 | | - const keyData = resolveCBOR(keys.get(i).to_cbor_hex()) |
223 | | - const key = isByteArray(keyData) ? keyData.bytes : String(keyData) |
224 | | - const val = resolveCBOR(plutusMap.get(keys.get(i))!.to_cbor_hex()) |
225 | | - map[key] = val |
226 | | - } |
227 | | - return map |
228 | | - } |
229 | | - case CML.PlutusDataKind.ConstrPlutusData: { |
230 | | - const constrData = data.as_constr_plutus_data()! |
231 | | - const fields = [] |
232 | | - const list = constrData.fields() |
233 | | - for (let i = 0; i < list.len(); i++) { |
234 | | - fields.push(resolveCBOR(list.get(i).to_cbor_hex())) |
235 | | - } |
236 | | - return Constr.make({ |
237 | | - constructor: Number(constrData.alternative()), |
238 | | - fields |
239 | | - }) |
240 | | - } |
241 | | - default: |
242 | | - throw new Error(`Unsupported type: ${data.kind()}`) |
243 | | - } |
244 | | -} |
245 | | - |
246 | | -/** |
247 | | - * Decodes an unknown value from Plutus Data Constructor to a TypeScript type |
248 | | - * |
249 | | - * @since 1.0.0 |
250 | | - */ |
251 | | -export const fromData = <Source, Target extends Data>( |
252 | | - input: unknown, |
253 | | - schema: Schema.Schema<Source, Target>, |
254 | | - options: SchemaAST.ParseOptions = {} |
255 | | -): Source => Schema.decodeUnknownSync(schema, options)(input) |
256 | | - |
257 | | -/** |
258 | | - * Encodes a TypeScript value to Plutus Data Constructor |
259 | | - * |
260 | | - * @since 1.0.0 |
261 | | - */ |
262 | | -export const toData = <Source, Target extends Data>( |
263 | | - input: unknown, |
264 | | - schema: Schema.Schema<Source, Target>, |
265 | | - options?: SchemaAST.ParseOptions |
266 | | -): Target => Schema.encodeUnknownSync(schema, options)(input) |
0 commit comments