@fastnear/utils 0.9.13 → 0.10.2

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.
@@ -1,12 +1,14 @@
1
- import { Schema, serialize, deserialize } from 'borsh';
1
+ import { Schema, serialize, deserialize } from '@fastnear/borsh';
2
2
  import * as borshSchema from '@fastnear/borsh-schema';
3
3
  export { sha256 } from '@noble/hashes/sha2.js';
4
4
  export { base58_to_binary as fromBase58, binary_to_base58 as toBase58 } from 'base58-js';
5
5
 
6
+ type KeyCurve = "ed25519" | "secp256k1";
7
+ declare function curveFromKey(key: string): KeyCurve;
6
8
  declare const keyFromString: (key: any) => Uint8Array<ArrayBufferLike>;
7
- declare const keyToString: (key: Uint8Array) => string;
9
+ declare const keyToString: (key: Uint8Array, curve?: KeyCurve) => string;
8
10
  declare function publicKeyFromPrivate(privateKey: string): string;
9
- declare function privateKeyFromRandom(): string;
11
+ declare function privateKeyFromRandom(curve?: KeyCurve): string;
10
12
  declare function signHash(hashBytes: Uint8Array, privateKey: string, opts?: any): Uint8Array | string;
11
13
  declare function signBytes(bytes: Uint8Array, privateKey: string): string | Uint8Array<ArrayBufferLike>;
12
14
 
@@ -27,9 +29,15 @@ declare const txToJsonStringified: (tx: PlainTransaction) => string;
27
29
  declare function mapTransaction(jsonTransaction: PlainTransaction): {
28
30
  signerId: string;
29
31
  publicKey: {
32
+ secp256k1Key: {
33
+ data: Uint8Array<ArrayBufferLike>;
34
+ };
35
+ ed25519Key?: undefined;
36
+ } | {
30
37
  ed25519Key: {
31
38
  data: Uint8Array<ArrayBufferLike>;
32
39
  };
40
+ secp256k1Key?: undefined;
33
41
  };
34
42
  nonce: bigint;
35
43
  receiverId: string;
@@ -115,4 +123,4 @@ declare const exp: {
115
123
  borshSchema: typeof borshSchema;
116
124
  };
117
125
 
118
- export { LsPrefix, type NEP413Message, type PlainSignedTransaction, type PlainTransaction, SCHEMA, type StorageBackend, base64ToBytes, bytesToBase64, canSignWithLAK, convertUnit, createDefaultStorage, deepCopy, exp, fromBase64, fromHex, keyFromString, keyToString, lsGet, lsSet, mapAction, mapTransaction, memoryStore, parseJsonFromBytes, privateKeyFromRandom, publicKeyFromPrivate, serializeSignedTransaction, serializeTransaction, signBytes, signHash, storage, toBase64, toHex, tryParseJson, txToJson, txToJsonStringified };
126
+ export { type KeyCurve, LsPrefix, type NEP413Message, type PlainSignedTransaction, type PlainTransaction, SCHEMA, type StorageBackend, base64ToBytes, bytesToBase64, canSignWithLAK, convertUnit, createDefaultStorage, curveFromKey, deepCopy, exp, fromBase64, fromHex, keyFromString, keyToString, lsGet, lsSet, mapAction, mapTransaction, memoryStore, parseJsonFromBytes, privateKeyFromRandom, publicKeyFromPrivate, serializeSignedTransaction, serializeTransaction, signBytes, signHash, storage, toBase64, toHex, tryParseJson, txToJson, txToJsonStringified };
package/dist/esm/index.js CHANGED
@@ -1,10 +1,10 @@
1
- /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.9.12) */
2
- /* https://www.npmjs.com/package/@fastnear/utils/v/0.9.12 */
1
+ /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.10.1) */
2
+ /* https://www.npmjs.com/package/@fastnear/utils/v/0.10.1 */
3
3
  export * from "./crypto.js";
4
4
  export * from "./transaction.js";
5
5
  export * from "./misc.js";
6
6
  export * from "./storage.js";
7
- import { serialize, deserialize } from "borsh";
7
+ import { serialize, deserialize } from "@fastnear/borsh";
8
8
  import * as borshSchema from "@fastnear/borsh-schema";
9
9
  const exp = {
10
10
  borsh: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from \"./crypto.js\";\nexport * from \"./transaction.js\";\nexport * from \"./misc.js\";\nexport * from \"./storage.js\";\n\nimport { serialize, deserialize } from \"borsh\";\nimport * as borshSchema from \"@fastnear/borsh-schema\";\n\n// exports (or re-exports as well)\nconst exp = {\n borsh: {\n serialize,\n deserialize\n },\n borshSchema,\n}\n\nexport { exp }\n"],"mappings":";;AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,WAAW,mBAAmB;AACvC,YAAY,iBAAiB;AAG7B,MAAM,MAAM;AAAA,EACV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAAA,EACA;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from \"./crypto.js\";\nexport * from \"./transaction.js\";\nexport * from \"./misc.js\";\nexport * from \"./storage.js\";\n\nimport { serialize, deserialize } from \"@fastnear/borsh\";\nimport * as borshSchema from \"@fastnear/borsh-schema\";\n\n// exports (or re-exports as well)\nconst exp = {\n borsh: {\n serialize,\n deserialize\n },\n borshSchema,\n}\n\nexport { exp }\n"],"mappings":";;AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,WAAW,mBAAmB;AACvC,YAAY,iBAAiB;AAG7B,MAAM,MAAM;AAAA,EACV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAAA,EACA;AACF;","names":[]}
package/dist/esm/misc.js CHANGED
@@ -1,12 +1,11 @@
1
- /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.9.12) */
2
- /* https://www.npmjs.com/package/@fastnear/utils/v/0.9.12 */
1
+ /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.10.1) */
2
+ /* https://www.npmjs.com/package/@fastnear/utils/v/0.10.1 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  import {
6
6
  binary_to_base58 as toBase58,
7
7
  base58_to_binary as fromBase58
8
8
  } from "base58-js";
9
- import Big from "big.js";
10
9
  import {
11
10
  encode as JsBase64Encode,
12
11
  decode as JsBase64Decode,
@@ -53,6 +52,32 @@ function fromBase64(strVal) {
53
52
  }
54
53
  }
55
54
  __name(fromBase64, "fromBase64");
55
+ const UNIT_DECIMALS = {
56
+ near: 24,
57
+ tgas: 12,
58
+ ggas: 9,
59
+ gas: 0,
60
+ yoctonear: 0
61
+ };
62
+ function scaleDecimal(amount, shift) {
63
+ const [whole, frac = ""] = amount.split(".");
64
+ if (shift >= 0) {
65
+ const padded = frac.padEnd(shift, "0").slice(0, shift);
66
+ const extra = frac.length > shift ? frac.slice(shift) : "";
67
+ if (extra && BigInt(extra) !== 0n) {
68
+ throw new Error(`Precision loss: "${amount}" has more than ${shift} decimal places`);
69
+ }
70
+ return BigInt(whole + padded).toString();
71
+ }
72
+ const divisor = 10n ** BigInt(-shift);
73
+ const bigVal = BigInt(whole);
74
+ const intPart = bigVal / divisor;
75
+ const remainder = bigVal % divisor;
76
+ if (remainder === 0n) return intPart.toString();
77
+ const fracStr = remainder.toString().padStart(-shift, "0").replace(/0+$/, "");
78
+ return `${intPart}.${fracStr}`;
79
+ }
80
+ __name(scaleDecimal, "scaleDecimal");
56
81
  function convertUnit(s, ...args) {
57
82
  if (Array.isArray(s)) {
58
83
  s = s.reduce((acc, part, i) => {
@@ -65,25 +90,15 @@ function convertUnit(s, ...args) {
65
90
  const amount = match[1].replace(/[_,]/g, "");
66
91
  const unitPart = match[2];
67
92
  if (unitPart) {
68
- switch (unitPart.toLowerCase()) {
69
- case "near":
70
- return Big(amount).mul(Big(10).pow(24)).toFixed(0);
71
- case "tgas":
72
- return Big(amount).mul(Big(10).pow(12)).toFixed(0);
73
- case "ggas":
74
- return Big(amount).mul(Big(10).pow(9)).toFixed(0);
75
- case "gas":
76
- case "yoctonear":
77
- return Big(amount).toFixed(0);
78
- default:
79
- throw new Error(`Unknown unit: ${unitPart}`);
80
- }
93
+ const decimals = UNIT_DECIMALS[unitPart.toLowerCase()];
94
+ if (decimals === void 0) throw new Error(`Unknown unit: ${unitPart}`);
95
+ return scaleDecimal(amount, decimals);
81
96
  } else {
82
- return Big(amount).toFixed(0);
97
+ return scaleDecimal(amount, 0);
83
98
  }
84
99
  }
85
100
  }
86
- return Big(`${s}`).toFixed(0);
101
+ return scaleDecimal(`${s}`, 0);
87
102
  }
88
103
  __name(convertUnit, "convertUnit");
89
104
  function lsSet(key, value) {
@@ -125,7 +140,7 @@ function parseJsonFromBytes(bytes) {
125
140
  }
126
141
  __name(parseJsonFromBytes, "parseJsonFromBytes");
127
142
  function canSignWithLAK(actions) {
128
- return actions.length === 1 && actions[0].type === "FunctionCall" && Big(actions[0]?.deposit ?? "0").eq(0);
143
+ return actions.length === 1 && actions[0].type === "FunctionCall" && BigInt(actions[0]?.deposit ?? "0") === 0n;
129
144
  }
130
145
  __name(canSignWithLAK, "canSignWithLAK");
131
146
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/misc.ts"],"sourcesContent":["import {\n binary_to_base58 as toBase58,\n base58_to_binary as fromBase58,\n} from \"base58-js\";\nimport Big from \"big.js\";\nimport {\n encode as JsBase64Encode,\n decode as JsBase64Decode,\n fromUint8Array as JsBase64FromUint8Array,\n toUint8Array as JsBase64ToUint8Array\n} from 'js-base64';\nimport { storage } from \"./storage.js\";\n\nexport { toBase58, fromBase58 };\n\nexport function toHex(data: Uint8Array): string {\n return Array.from(data)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function fromHex(hex: string): Uint8Array {\n if (hex.length % 2) throw new Error('Hex string must be even length');\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i/2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nexport function base64ToBytes(b64Val: string): Uint8Array {\n return JsBase64ToUint8Array(b64Val);\n}\n\nexport function bytesToBase64(bytesArr: Uint8Array): string {\n return JsBase64FromUint8Array(bytesArr);\n}\n\nexport function toBase64(strVal: string) {\n try {\n return JsBase64Encode(strVal);\n } catch (e) {\n console.error('Issue base64 encoding', e);\n return null;\n }\n}\n\nexport function fromBase64(strVal: string) {\n try {\n return JsBase64Decode(strVal);\n } catch (e) {\n console.error('Issue base64 decoding', e);\n return null;\n }\n}\n\nexport function convertUnit(s: string | TemplateStringsArray, ...args: any[]): string {\n // Reconstruct raw string from template literal\n if (Array.isArray(s)) {\n s = s.reduce((acc, part, i) => {\n return acc + (args[i - 1] ?? \"\") + part;\n });\n }\n // Convert from `100 NEAR` into yoctoNear\n if (typeof s == \"string\") {\n const match = s.match(/([0-9.,_]+)\\s*([a-zA-Z]+)?/);\n if (match) {\n const amount = match[1].replace(/[_,]/g, \"\");\n const unitPart = match[2];\n if (unitPart) {\n switch (unitPart.toLowerCase()) {\n case \"near\":\n return Big(amount).mul(Big(10).pow(24)).toFixed(0);\n case \"tgas\":\n return Big(amount).mul(Big(10).pow(12)).toFixed(0);\n case \"ggas\":\n return Big(amount).mul(Big(10).pow(9)).toFixed(0);\n case \"gas\":\n case \"yoctonear\":\n return Big(amount).toFixed(0);\n default:\n throw new Error(`Unknown unit: ${unitPart}`);\n }\n } else {\n return Big(amount).toFixed(0);\n }\n }\n }\n return Big(`${s}`).toFixed(0);\n}\n\nexport function lsSet(key: string, value: any) {\n storage.set(key, value);\n}\n\nexport function lsGet(key: string): any {\n return storage.get(key);\n}\n\nexport function deepCopy(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function tryParseJson(...args) {\n try {\n return JSON.parse(args[0]);\n } catch {\n if (args.length > 1) {\n return args[1];\n }\n return args[0];\n }\n}\n\nexport function parseJsonFromBytes(bytes: Uint8Array) {\n try {\n const decoder = new TextDecoder();\n return JSON.parse(\n decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))\n );\n } catch (e) {\n try {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n } catch (e) {\n return bytes;\n }\n }\n}\n\n/**\n * NEP-413 standard message payload for wallet signing.\n */\nexport interface NEP413Message {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string | null;\n state?: string | null;\n}\n\nexport function canSignWithLAK(actions) {\n return (\n actions.length === 1 &&\n actions[0].type === \"FunctionCall\" &&\n Big(actions[0]?.deposit ?? \"0\").eq(0)\n );\n}\n"],"mappings":"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","names":["e"]}
1
+ {"version":3,"sources":["../../src/misc.ts"],"sourcesContent":["import {\n binary_to_base58 as toBase58,\n base58_to_binary as fromBase58,\n} from \"base58-js\";\nimport {\n encode as JsBase64Encode,\n decode as JsBase64Decode,\n fromUint8Array as JsBase64FromUint8Array,\n toUint8Array as JsBase64ToUint8Array\n} from 'js-base64';\nimport { storage } from \"./storage.js\";\n\nexport { toBase58, fromBase58 };\n\nexport function toHex(data: Uint8Array): string {\n return Array.from(data)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function fromHex(hex: string): Uint8Array {\n if (hex.length % 2) throw new Error('Hex string must be even length');\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i/2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nexport function base64ToBytes(b64Val: string): Uint8Array {\n return JsBase64ToUint8Array(b64Val);\n}\n\nexport function bytesToBase64(bytesArr: Uint8Array): string {\n return JsBase64FromUint8Array(bytesArr);\n}\n\nexport function toBase64(strVal: string) {\n try {\n return JsBase64Encode(strVal);\n } catch (e) {\n console.error('Issue base64 encoding', e);\n return null;\n }\n}\n\nexport function fromBase64(strVal: string) {\n try {\n return JsBase64Decode(strVal);\n } catch (e) {\n console.error('Issue base64 decoding', e);\n return null;\n }\n}\n\nconst UNIT_DECIMALS: Record<string, number> = {\n near: 24,\n tgas: 12,\n ggas: 9,\n gas: 0,\n yoctonear: 0,\n};\n\n/**\n * Scale a decimal string by `shift` decimal places using BigInt.\n * Positive shift multiplies (e.g. NEAR → yoctoNEAR), zero shift truncates decimals.\n */\nfunction scaleDecimal(amount: string, shift: number): string {\n const [whole, frac = \"\"] = amount.split(\".\");\n if (shift >= 0) {\n // Pad fractional part to `shift` digits, then concatenate — this multiplies by 10^shift\n const padded = frac.padEnd(shift, \"0\").slice(0, shift);\n const extra = frac.length > shift ? frac.slice(shift) : \"\";\n if (extra && BigInt(extra) !== 0n) {\n throw new Error(`Precision loss: \"${amount}\" has more than ${shift} decimal places`);\n }\n return BigInt(whole + padded).toString();\n }\n // Negative shift: divide by 10^|shift| (shouldn't happen with current units)\n const divisor = 10n ** BigInt(-shift);\n const bigVal = BigInt(whole);\n const intPart = bigVal / divisor;\n const remainder = bigVal % divisor;\n if (remainder === 0n) return intPart.toString();\n const fracStr = remainder.toString().padStart(-shift, \"0\").replace(/0+$/, \"\");\n return `${intPart}.${fracStr}`;\n}\n\nexport function convertUnit(s: string | TemplateStringsArray, ...args: any[]): string {\n // Reconstruct raw string from template literal\n if (Array.isArray(s)) {\n s = s.reduce((acc, part, i) => {\n return acc + (args[i - 1] ?? \"\") + part;\n });\n }\n // Convert from `100 NEAR` into yoctoNear\n if (typeof s == \"string\") {\n const match = s.match(/([0-9.,_]+)\\s*([a-zA-Z]+)?/);\n if (match) {\n const amount = match[1].replace(/[_,]/g, \"\");\n const unitPart = match[2];\n if (unitPart) {\n const decimals = UNIT_DECIMALS[unitPart.toLowerCase()];\n if (decimals === undefined) throw new Error(`Unknown unit: ${unitPart}`);\n return scaleDecimal(amount, decimals);\n } else {\n // No unit — truncate any decimals\n return scaleDecimal(amount, 0);\n }\n }\n }\n return scaleDecimal(`${s}`, 0);\n}\n\nexport function lsSet(key: string, value: any) {\n storage.set(key, value);\n}\n\nexport function lsGet(key: string): any {\n return storage.get(key);\n}\n\nexport function deepCopy(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nexport function tryParseJson(...args) {\n try {\n return JSON.parse(args[0]);\n } catch {\n if (args.length > 1) {\n return args[1];\n }\n return args[0];\n }\n}\n\nexport function parseJsonFromBytes(bytes: Uint8Array) {\n try {\n const decoder = new TextDecoder();\n return JSON.parse(\n decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))\n );\n } catch (e) {\n try {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n } catch (e) {\n return bytes;\n }\n }\n}\n\n/**\n * NEP-413 standard message payload for wallet signing.\n */\nexport interface NEP413Message {\n message: string;\n nonce: Uint8Array;\n recipient: string;\n callbackUrl?: string | null;\n state?: string | null;\n}\n\nexport function canSignWithLAK(actions) {\n return (\n actions.length === 1 &&\n actions[0].type === \"FunctionCall\" &&\n BigInt(actions[0]?.deposit ?? \"0\") === 0n\n );\n}\n"],"mappings":"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","names":["e"]}
@@ -1,5 +1,5 @@
1
- /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.9.12) */
2
- /* https://www.npmjs.com/package/@fastnear/utils/v/0.9.12 */
1
+ /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.10.1) */
2
+ /* https://www.npmjs.com/package/@fastnear/utils/v/0.10.1 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
5
  const LsPrefix = "__fastnear_";
@@ -1,9 +1,9 @@
1
- /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.9.12) */
2
- /* https://www.npmjs.com/package/@fastnear/utils/v/0.9.12 */
1
+ /* ⋈ 🏃🏻💨 FastNear Utils - ESM (@fastnear/utils version 0.10.1) */
2
+ /* https://www.npmjs.com/package/@fastnear/utils/v/0.10.1 */
3
3
  var __defProp = Object.defineProperty;
4
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
- import { serialize as borshSerialize } from "borsh";
6
- import { keyFromString } from "./crypto.js";
5
+ import { serialize as borshSerialize } from "@fastnear/borsh";
6
+ import { curveFromKey, keyFromString } from "./crypto.js";
7
7
  import { base64ToBytes, fromBase58 } from "./misc.js";
8
8
  import { getBorshSchema } from "@fastnear/borsh-schema";
9
9
  const txToJson = /* @__PURE__ */ __name((tx) => {
@@ -15,14 +15,22 @@ const txToJson = /* @__PURE__ */ __name((tx) => {
15
15
  const txToJsonStringified = /* @__PURE__ */ __name((tx) => {
16
16
  return JSON.stringify(txToJson(tx));
17
17
  }, "txToJsonStringified");
18
+ function mapPublicKey(keyString) {
19
+ const curve = curveFromKey(keyString);
20
+ const data = keyFromString(keyString);
21
+ return curve === "secp256k1" ? { secp256k1Key: { data } } : { ed25519Key: { data } };
22
+ }
23
+ __name(mapPublicKey, "mapPublicKey");
24
+ function mapSignature(sigBase58, signerKeyString) {
25
+ const curve = curveFromKey(signerKeyString);
26
+ const data = fromBase58(sigBase58);
27
+ return curve === "secp256k1" ? { secp256k1Signature: { data } } : { ed25519Signature: { data } };
28
+ }
29
+ __name(mapSignature, "mapSignature");
18
30
  function mapTransaction(jsonTransaction) {
19
31
  return {
20
32
  signerId: jsonTransaction.signerId,
21
- publicKey: {
22
- ed25519Key: {
23
- data: keyFromString(jsonTransaction.publicKey)
24
- }
25
- },
33
+ publicKey: mapPublicKey(jsonTransaction.publicKey),
26
34
  nonce: BigInt(jsonTransaction.nonce),
27
35
  receiverId: jsonTransaction.receiverId,
28
36
  blockHash: fromBase58(jsonTransaction.blockHash),
@@ -45,13 +53,9 @@ function serializeSignedTransaction(jsonTransaction, signature) {
45
53
  console.log("fastnear: mapped (for borsh schema) signed transaction", mappedSignedTx);
46
54
  const plainSignedTransaction = {
47
55
  transaction: mappedSignedTx,
48
- signature: {
49
- ed25519Signature: {
50
- data: fromBase58(signature)
51
- }
52
- }
56
+ signature: mapSignature(signature, jsonTransaction.publicKey)
53
57
  };
54
- const borshSignedTx = borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction, true);
58
+ const borshSignedTx = borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction);
55
59
  console.log("fastnear: borsh-serialized signed transaction:", borshSignedTx);
56
60
  return borshSignedTx;
57
61
  }
@@ -91,22 +95,14 @@ function mapAction(action) {
91
95
  return {
92
96
  stake: {
93
97
  stake: BigInt(action.stake),
94
- publicKey: {
95
- ed25519Key: {
96
- data: keyFromString(action.publicKey)
97
- }
98
- }
98
+ publicKey: mapPublicKey(action.publicKey)
99
99
  }
100
100
  };
101
101
  }
102
102
  case "AddKey": {
103
103
  return {
104
104
  addKey: {
105
- publicKey: {
106
- ed25519Key: {
107
- data: keyFromString(action.publicKey)
108
- }
109
- },
105
+ publicKey: mapPublicKey(action.publicKey),
110
106
  accessKey: {
111
107
  nonce: BigInt(action.accessKey.nonce),
112
108
  permission: action.accessKey.permission === "FullAccess" ? { fullAccess: {} } : {
@@ -123,11 +119,7 @@ function mapAction(action) {
123
119
  case "DeleteKey": {
124
120
  return {
125
121
  deleteKey: {
126
- publicKey: {
127
- ed25519Key: {
128
- data: keyFromString(action.publicKey)
129
- }
130
- }
122
+ publicKey: mapPublicKey(action.publicKey)
131
123
  }
132
124
  };
133
125
  }
@@ -142,9 +134,7 @@ function mapAction(action) {
142
134
  return {
143
135
  signedDelegate: {
144
136
  delegateAction: mapAction(action.delegateAction),
145
- signature: {
146
- ed25519Signature: fromBase58(action.signature)
147
- }
137
+ signature: mapSignature(action.signature, action.publicKey)
148
138
  }
149
139
  };
150
140
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transaction.ts"],"sourcesContent":["import { serialize as borshSerialize, deserialize as borshDeserialize, Schema } from \"borsh\";\nimport { keyFromString } from \"./crypto.js\";\nimport {base64ToBytes, fromBase58, fromBase64, toBase64} from \"./misc.js\";\nimport { getBorshSchema } from \"@fastnear/borsh-schema\";\n\nexport interface PlainTransaction {\n signerId: string;\n publicKey: string;\n nonce: string | bigint | number;\n receiverId: string;\n blockHash: string;\n actions: Array<any>;\n}\n\nexport interface PlainSignedTransaction {\n transaction: object;\n signature: object;\n}\n\n// Function to return a JSON-ready version of the transaction\nexport const txToJson = (tx: PlainTransaction): Record<string, any> => {\n return JSON.parse(JSON.stringify(tx, (key, value) =>\n typeof value === 'bigint' ? value.toString() : value\n ));\n};\n\n// dude let's make this better. head just couldn't find a good name\nexport const txToJsonStringified = (tx: PlainTransaction): string => {\n return JSON.stringify(txToJson(tx));\n}\n\nexport function mapTransaction(jsonTransaction: PlainTransaction) {\n return {\n signerId: jsonTransaction.signerId,\n publicKey: {\n ed25519Key: {\n data: keyFromString(jsonTransaction.publicKey)\n }\n },\n nonce: BigInt(jsonTransaction.nonce),\n receiverId: jsonTransaction.receiverId,\n blockHash: fromBase58(jsonTransaction.blockHash),\n actions: jsonTransaction.actions.map(mapAction)\n };\n}\n\nexport function serializeTransaction(jsonTransaction: PlainTransaction) {\n console.log(\"fastnear: serializing transaction\");\n\n const transaction = mapTransaction(jsonTransaction);\n console.log(\"fastnear: mapped transaction for borsh:\", transaction);\n\n return borshSerialize(SCHEMA.Transaction, transaction);\n}\n\nexport function serializeSignedTransaction(jsonTransaction: PlainTransaction, signature) {\n console.log(\"fastnear: Serializing Signed Transaction\", jsonTransaction);\n console.log('fastnear: signature', signature)\n console.log('fastnear: signature length', fromBase58(signature).length)\n\n const mappedSignedTx = mapTransaction(jsonTransaction)\n console.log('fastnear: mapped (for borsh schema) signed transaction', mappedSignedTx)\n\n const plainSignedTransaction: PlainSignedTransaction = {\n transaction: mappedSignedTx,\n signature: {\n ed25519Signature: {\n data: fromBase58(signature),\n },\n },\n };\n\n const borshSignedTx = borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction, true);\n console.log('fastnear: borsh-serialized signed transaction:', borshSignedTx);\n\n return borshSignedTx;\n}\n\nexport function mapAction(action: any): object {\n switch (action.type) {\n case \"CreateAccount\": {\n return {\n createAccount: {},\n };\n }\n case \"DeployContract\": {\n return {\n deployContract: {\n code: base64ToBytes(action.codeBase64),\n },\n };\n }\n case \"FunctionCall\": {\n return {\n functionCall: {\n methodName: action.methodName,\n args: (action.argsBase64 !== null && action.argsBase64 !== undefined) ?\n base64ToBytes(action.argsBase64) :\n (new TextEncoder().encode(JSON.stringify(action.args))),\n gas: BigInt(action.gas ?? \"300000000000000\"),\n deposit: BigInt(action.deposit ?? \"0\"),\n },\n };\n }\n case \"Transfer\": {\n return {\n transfer: {\n deposit: BigInt(action.deposit),\n },\n };\n }\n case \"Stake\": {\n return {\n stake: {\n stake: BigInt(action.stake),\n publicKey: {\n ed25519Key: {\n data: keyFromString(action.publicKey),\n },\n },\n },\n };\n }\n case \"AddKey\": {\n return {\n addKey: {\n publicKey: {\n ed25519Key: {\n data: keyFromString(action.publicKey),\n },\n },\n accessKey: {\n nonce: BigInt(action.accessKey.nonce),\n permission:\n action.accessKey.permission === \"FullAccess\"\n ? { fullAccess: {} }\n : {\n functionCall: {\n allowance: action.accessKey.allowance\n ? BigInt(action.accessKey.allowance)\n : null,\n receiverId: action.accessKey.receiverId,\n methodNames: action.accessKey.methodNames,\n },\n },\n },\n },\n };\n }\n case \"DeleteKey\": {\n return {\n deleteKey: {\n publicKey: {\n ed25519Key: {\n data: keyFromString(action.publicKey),\n },\n },\n },\n };\n }\n case \"DeleteAccount\": {\n return {\n deleteAccount: {\n beneficiaryId: action.beneficiaryId,\n },\n };\n }\n case \"SignedDelegate\": {\n return {\n signedDelegate: {\n delegateAction: mapAction(action.delegateAction),\n signature: {\n ed25519Signature: fromBase58(action.signature),\n },\n },\n };\n }\n default: {\n throw new Error(\"Not implemented action: \" + action.type);\n }\n }\n}\n\nexport const SCHEMA = getBorshSchema();\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/transaction.ts"],"sourcesContent":["import { serialize as borshSerialize, deserialize as borshDeserialize, type Schema } from \"@fastnear/borsh\";\nimport { curveFromKey, keyFromString } from \"./crypto.js\";\nimport {base64ToBytes, fromBase58, fromBase64, toBase64} from \"./misc.js\";\nimport { getBorshSchema } from \"@fastnear/borsh-schema\";\n\nexport interface PlainTransaction {\n signerId: string;\n publicKey: string;\n nonce: string | bigint | number;\n receiverId: string;\n blockHash: string;\n actions: Array<any>;\n}\n\nexport interface PlainSignedTransaction {\n transaction: object;\n signature: object;\n}\n\n// Function to return a JSON-ready version of the transaction\nexport const txToJson = (tx: PlainTransaction): Record<string, any> => {\n return JSON.parse(JSON.stringify(tx, (key, value) =>\n typeof value === 'bigint' ? value.toString() : value\n ));\n};\n\n// dude let's make this better. head just couldn't find a good name\nexport const txToJsonStringified = (tx: PlainTransaction): string => {\n return JSON.stringify(txToJson(tx));\n}\n\nfunction mapPublicKey(keyString: string) {\n const curve = curveFromKey(keyString);\n const data = keyFromString(keyString);\n return curve === \"secp256k1\"\n ? { secp256k1Key: { data } }\n : { ed25519Key: { data } };\n}\n\nfunction mapSignature(sigBase58: string, signerKeyString: string) {\n const curve = curveFromKey(signerKeyString);\n const data = fromBase58(sigBase58);\n return curve === \"secp256k1\"\n ? { secp256k1Signature: { data } }\n : { ed25519Signature: { data } };\n}\n\nexport function mapTransaction(jsonTransaction: PlainTransaction) {\n return {\n signerId: jsonTransaction.signerId,\n publicKey: mapPublicKey(jsonTransaction.publicKey),\n nonce: BigInt(jsonTransaction.nonce),\n receiverId: jsonTransaction.receiverId,\n blockHash: fromBase58(jsonTransaction.blockHash),\n actions: jsonTransaction.actions.map(mapAction)\n };\n}\n\nexport function serializeTransaction(jsonTransaction: PlainTransaction) {\n console.log(\"fastnear: serializing transaction\");\n\n const transaction = mapTransaction(jsonTransaction);\n console.log(\"fastnear: mapped transaction for borsh:\", transaction);\n\n return borshSerialize(SCHEMA.Transaction, transaction);\n}\n\nexport function serializeSignedTransaction(jsonTransaction: PlainTransaction, signature) {\n console.log(\"fastnear: Serializing Signed Transaction\", jsonTransaction);\n console.log('fastnear: signature', signature)\n console.log('fastnear: signature length', fromBase58(signature).length)\n\n const mappedSignedTx = mapTransaction(jsonTransaction)\n console.log('fastnear: mapped (for borsh schema) signed transaction', mappedSignedTx)\n\n const plainSignedTransaction: PlainSignedTransaction = {\n transaction: mappedSignedTx,\n signature: mapSignature(signature, jsonTransaction.publicKey),\n };\n\n const borshSignedTx = borshSerialize(SCHEMA.SignedTransaction, plainSignedTransaction);\n console.log('fastnear: borsh-serialized signed transaction:', borshSignedTx);\n\n return borshSignedTx;\n}\n\nexport function mapAction(action: any): object {\n switch (action.type) {\n case \"CreateAccount\": {\n return {\n createAccount: {},\n };\n }\n case \"DeployContract\": {\n return {\n deployContract: {\n code: base64ToBytes(action.codeBase64),\n },\n };\n }\n case \"FunctionCall\": {\n return {\n functionCall: {\n methodName: action.methodName,\n args: (action.argsBase64 !== null && action.argsBase64 !== undefined) ?\n base64ToBytes(action.argsBase64) :\n (new TextEncoder().encode(JSON.stringify(action.args))),\n gas: BigInt(action.gas ?? \"300000000000000\"),\n deposit: BigInt(action.deposit ?? \"0\"),\n },\n };\n }\n case \"Transfer\": {\n return {\n transfer: {\n deposit: BigInt(action.deposit),\n },\n };\n }\n case \"Stake\": {\n return {\n stake: {\n stake: BigInt(action.stake),\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"AddKey\": {\n return {\n addKey: {\n publicKey: mapPublicKey(action.publicKey),\n accessKey: {\n nonce: BigInt(action.accessKey.nonce),\n permission:\n action.accessKey.permission === \"FullAccess\"\n ? { fullAccess: {} }\n : {\n functionCall: {\n allowance: action.accessKey.allowance\n ? BigInt(action.accessKey.allowance)\n : null,\n receiverId: action.accessKey.receiverId,\n methodNames: action.accessKey.methodNames,\n },\n },\n },\n },\n };\n }\n case \"DeleteKey\": {\n return {\n deleteKey: {\n publicKey: mapPublicKey(action.publicKey),\n },\n };\n }\n case \"DeleteAccount\": {\n return {\n deleteAccount: {\n beneficiaryId: action.beneficiaryId,\n },\n };\n }\n case \"SignedDelegate\": {\n return {\n signedDelegate: {\n delegateAction: mapAction(action.delegateAction),\n signature: mapSignature(action.signature, action.publicKey),\n },\n };\n }\n default: {\n throw new Error(\"Not implemented action: \" + action.type);\n }\n }\n}\n\nexport const SCHEMA = getBorshSchema();\n"],"mappings":"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","names":[]}