@fewcha/aptos
Version:
1,575 lines (1,547 loc) • 245 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __decorateClass = (decorators, target, key, kind) => {
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result)
__defProp(target, key, result);
return result;
};
// src/index.ts
var src_exports = {};
__export(src_exports, {
AnsClient: () => AnsClient,
ApiError: () => ApiError,
AptosAccount: () => AptosAccount,
AptosApiError: () => AptosApiError,
AptosClient: () => AptosClient,
AptosToken: () => AptosToken,
BCS: () => bcs_exports,
CoinClient: () => CoinClient,
FailedTransactionError: () => FailedTransactionError,
FaucetClient: () => FaucetClient,
FungibleAssetClient: () => FungibleAssetClient,
HexString: () => HexString,
IndexerClient: () => IndexerClient,
Network: () => Network,
Provider: () => Provider,
TokenClient: () => TokenClient,
TokenTypes: () => token_types_exports,
TransactionBuilder: () => TransactionBuilder,
TransactionBuilderABI: () => TransactionBuilderABI,
TransactionBuilderEd25519: () => TransactionBuilderEd25519,
TransactionBuilderMultiEd25519: () => TransactionBuilderMultiEd25519,
TransactionBuilderRemoteABI: () => TransactionBuilderRemoteABI,
TxnBuilderTypes: () => aptos_types_exports,
TypeTagParser: () => TypeTagParser,
Types: () => generated_exports,
WaitForTransactionError: () => WaitForTransactionError,
aptosRequest: () => aptosRequest,
derivePath: () => derivePath,
deserializePropertyMap: () => deserializePropertyMap,
deserializeValueBasedOnTypeTag: () => deserializeValueBasedOnTypeTag,
get: () => get,
getAddressFromAccountOrAddress: () => getAddressFromAccountOrAddress,
getPropertyValueRaw: () => getPropertyValueRaw,
post: () => post
});
module.exports = __toCommonJS(src_exports);
// src/account/aptos_account.ts
var import_tweetnacl2 = __toESM(require("tweetnacl"));
var bip39 = __toESM(require("@scure/bip39"));
var import_utils6 = require("@noble/hashes/utils");
var import_sha256 = require("@noble/hashes/sha256");
var import_sha33 = require("@noble/hashes/sha3");
// src/utils/hd-key.ts
var import_tweetnacl = __toESM(require("tweetnacl"));
var import_hmac = require("@noble/hashes/hmac");
var import_sha512 = require("@noble/hashes/sha512");
var import_utils = require("@noble/hashes/utils");
var pathRegex = /^m(\/[0-9]+')+$/;
var replaceDerive = (val) => val.replace("'", "");
var HMAC_KEY = "ed25519 seed";
var HARDENED_OFFSET = 2147483648;
var getMasterKeyFromSeed = (seed) => {
const h = import_hmac.hmac.create(import_sha512.sha512, HMAC_KEY);
const I = h.update((0, import_utils.hexToBytes)(seed)).digest();
const IL = I.slice(0, 32);
const IR = I.slice(32);
return {
key: IL,
chainCode: IR
};
};
var CKDPriv = ({ key, chainCode }, index) => {
const buffer = new ArrayBuffer(4);
new DataView(buffer).setUint32(0, index);
const indexBytes = new Uint8Array(buffer);
const zero = new Uint8Array([0]);
const data = new Uint8Array([...zero, ...key, ...indexBytes]);
const I = import_hmac.hmac.create(import_sha512.sha512, chainCode).update(data).digest();
const IL = I.slice(0, 32);
const IR = I.slice(32);
return {
key: IL,
chainCode: IR
};
};
var isValidPath = (path) => {
if (!pathRegex.test(path)) {
return false;
}
return !path.split("/").slice(1).map(replaceDerive).some(Number.isNaN);
};
var derivePath = (path, seed, offset = HARDENED_OFFSET) => {
if (!isValidPath(path)) {
throw new Error("Invalid derivation path");
}
const { key, chainCode } = getMasterKeyFromSeed(seed);
const segments = path.split("/").slice(1).map(replaceDerive).map((el) => parseInt(el, 10));
return segments.reduce((parentKeys, segment) => CKDPriv(parentKeys, segment + offset), { key, chainCode });
};
// src/version.ts
var VERSION = "1.14.0";
// src/utils/misc.ts
async function sleep(timeMs) {
return new Promise((resolve2) => {
setTimeout(resolve2, timeMs);
});
}
var DEFAULT_VERSION_PATH_BASE = "/v1";
function fixNodeUrl(nodeUrl) {
let out = `${nodeUrl}`;
if (out.endsWith("/")) {
out = out.substring(0, out.length - 1);
}
if (!out.endsWith(DEFAULT_VERSION_PATH_BASE)) {
out = `${out}${DEFAULT_VERSION_PATH_BASE}`;
}
return out;
}
var DEFAULT_MAX_GAS_AMOUNT = 2e5;
var DEFAULT_TXN_EXP_SEC_FROM_NOW = 20;
var DEFAULT_TXN_TIMEOUT_SEC = 20;
var APTOS_COIN = "0x1::aptos_coin::AptosCoin";
var CUSTOM_REQUEST_HEADER = { "x-aptos-client": `aptos-ts-sdk/${VERSION}` };
// src/utils/memoize-decorator.ts
function Memoize(args) {
let hashFunction;
let ttlMs;
let tags;
if (typeof args === "object") {
hashFunction = args.hashFunction;
ttlMs = args.ttlMs;
tags = args.tags;
} else {
hashFunction = args;
}
return (target, propertyKey, descriptor) => {
if (descriptor.value != null) {
descriptor.value = getNewFunction(descriptor.value, hashFunction, ttlMs, tags);
} else if (descriptor.get != null) {
descriptor.get = getNewFunction(descriptor.get, hashFunction, ttlMs, tags);
} else {
throw new Error("Only put a Memoize() decorator on a method or get accessor.");
}
};
}
function MemoizeExpiring(ttlMs, hashFunction) {
return Memoize({
ttlMs,
hashFunction
});
}
var clearCacheTagsMap = /* @__PURE__ */ new Map();
function clear(tags) {
const cleared = /* @__PURE__ */ new Set();
for (const tag of tags) {
const maps = clearCacheTagsMap.get(tag);
if (maps) {
for (const mp of maps) {
if (!cleared.has(mp)) {
mp.clear();
cleared.add(mp);
}
}
}
}
return cleared.size;
}
function getNewFunction(originalMethod, hashFunction, ttlMs = 0, tags) {
const propMapName = Symbol("__memoized_map__");
return function(...args) {
let returnedValue;
const that = this;
if (!that.hasOwnProperty(propMapName)) {
Object.defineProperty(that, propMapName, {
configurable: false,
enumerable: false,
writable: false,
value: /* @__PURE__ */ new Map()
});
}
const myMap = that[propMapName];
if (Array.isArray(tags)) {
for (const tag of tags) {
if (clearCacheTagsMap.has(tag)) {
clearCacheTagsMap.get(tag).push(myMap);
} else {
clearCacheTagsMap.set(tag, [myMap]);
}
}
}
if (hashFunction || args.length > 0 || ttlMs > 0) {
let hashKey;
if (hashFunction === true) {
hashKey = args.map((a) => a.toString()).join("!");
} else if (hashFunction) {
hashKey = hashFunction.apply(that, args);
} else {
hashKey = args[0];
}
const timestampKey = `${hashKey}__timestamp`;
let isExpired = false;
if (ttlMs > 0) {
if (!myMap.has(timestampKey)) {
isExpired = true;
} else {
const timestamp = myMap.get(timestampKey);
isExpired = Date.now() - timestamp > ttlMs;
}
}
if (myMap.has(hashKey) && !isExpired) {
returnedValue = myMap.get(hashKey);
} else {
returnedValue = originalMethod.apply(that, args);
myMap.set(hashKey, returnedValue);
if (ttlMs > 0) {
myMap.set(timestampKey, Date.now());
}
}
} else {
const hashKey = that;
if (myMap.has(hashKey)) {
returnedValue = myMap.get(hashKey);
} else {
returnedValue = originalMethod.apply(that, args);
myMap.set(hashKey, returnedValue);
}
}
return returnedValue;
};
}
// src/client/core.ts
var import_axios2 = __toESM(require("axios"));
// src/client/types.ts
var AptosApiError = class extends Error {
constructor(request2, response, message) {
super(message);
this.name = "AptosApiError";
this.url = response.url;
this.status = response.status;
this.statusText = response.statusText;
this.data = response.data;
this.request = request2;
}
};
// src/client/cookieJar.ts
var import_axios = __toESM(require("axios"));
var CookieJar = class {
constructor(jar3 = /* @__PURE__ */ new Map()) {
this.jar = jar3;
}
setCookie(url, cookieStr) {
var _a;
const key = url.origin.toLowerCase();
if (!this.jar.has(key)) {
this.jar.set(key, []);
}
const cookie = CookieJar.parse(cookieStr);
this.jar.set(key, [...((_a = this.jar.get(key)) == null ? void 0 : _a.filter((c) => c.name !== cookie.name)) || [], cookie]);
}
getCookies(url) {
var _a;
const key = url.origin.toLowerCase();
if (!this.jar.get(key)) {
return [];
}
return ((_a = this.jar.get(key)) == null ? void 0 : _a.filter((cookie) => !cookie.expires || cookie.expires > new Date())) || [];
}
static parse(str) {
if (typeof str !== "string") {
throw new Error("argument str must be a string");
}
const parts = str.split(";").map((part) => part.trim());
let cookie;
if (parts.length > 0) {
const [name, value] = parts[0].split("=");
if (!name || !value) {
throw new Error("Invalid cookie");
}
cookie = {
name,
value
};
} else {
throw new Error("Invalid cookie");
}
parts.slice(1).forEach((part) => {
const [name, value] = part.split("=");
if (!name.trim()) {
throw new Error("Invalid cookie");
}
const nameLow = name.toLowerCase();
const val = (value == null ? void 0 : value.charAt(0)) === "'" || (value == null ? void 0 : value.charAt(0)) === '"' ? value == null ? void 0 : value.slice(1, -1) : value;
if (nameLow === "expires") {
cookie.expires = new Date(val);
}
if (nameLow === "path") {
cookie.path = val;
}
if (nameLow === "samesite") {
if (val !== "Lax" && val !== "None" && val !== "Strict") {
throw new Error("Invalid cookie SameSite value");
}
cookie.sameSite = val;
}
if (nameLow === "secure") {
cookie.secure = true;
}
});
return cookie;
}
};
var jar = new CookieJar();
import_axios.default.interceptors.response.use((response) => {
if (Array.isArray(response.headers["set-cookie"])) {
response.headers["set-cookie"].forEach((c) => {
jar.setCookie(new URL(response.config.url), c);
});
}
return response;
});
import_axios.default.interceptors.request.use(function(config) {
const cookies = jar.getCookies(new URL(config.url));
if ((cookies == null ? void 0 : cookies.length) > 0 && config.headers) {
config.headers.cookie = cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join("; ");
}
return config;
});
// src/client/core.ts
var import_axios_fetch_adapter = __toESM(require("@vespaiach/axios-fetch-adapter"));
var errors = {
400: "Bad Request",
401: "Unauthorized",
403: "Forbidden",
404: "Not Found",
429: "Too Many Requests",
500: "Internal Server Error",
502: "Bad Gateway",
503: "Service Unavailable"
};
async function axiosRequest(url, method, body, contentType, params, overrides) {
var _a;
const headers = {
...overrides == null ? void 0 : overrides.HEADERS,
"x-aptos-client": `aptos-ts-sdk/${VERSION}`,
"content-type": contentType != null ? contentType : "application/json"
};
if (overrides == null ? void 0 : overrides.TOKEN) {
headers.Authorization = `Bearer ${overrides == null ? void 0 : overrides.TOKEN}`;
}
const requestConfig = {
headers,
method,
url,
params,
data: body,
adapter: import_axios_fetch_adapter.default,
withCredentials: (_a = overrides == null ? void 0 : overrides.WITH_CREDENTIALS) != null ? _a : true
};
try {
return await (0, import_axios2.default)(requestConfig);
} catch (error) {
const axiosError = error;
if (axiosError.response) {
return axiosError.response;
}
throw error;
}
}
async function aptosRequest(options) {
const { url, endpoint, method, body, contentType, params, overrides } = options;
const fullEndpoint = `${url}/${endpoint != null ? endpoint : ""}`;
const response = await axiosRequest(fullEndpoint, method, body, contentType, params, overrides);
const result = {
status: response.status,
statusText: response.statusText,
data: response.data,
headers: response.headers,
config: response.config,
url: fullEndpoint
};
if (response.status >= 200 && response.status < 300) {
return result;
}
const errorMessage = errors[response.status];
throw new AptosApiError(options, result, errorMessage != null ? errorMessage : "Generic Error");
}
// src/client/get.ts
async function get(options) {
const response = await aptosRequest({ ...options, method: "GET" });
return response;
}
// src/client/post.ts
async function post(options) {
const response = await aptosRequest({ ...options, method: "POST" });
return response;
}
// src/utils/pagination_helpers.ts
async function paginateWithCursor(options) {
const out = [];
let cursor;
const requestParams = options.params;
while (true) {
requestParams.start = cursor;
const response = await get({
url: options.url,
endpoint: options.endpoint,
params: requestParams,
originMethod: options.originMethod,
overrides: options.overrides
});
cursor = response.headers["x-aptos-cursor"];
delete response.headers;
out.push(...response.data);
if (cursor === null || cursor === void 0) {
break;
}
}
return out;
}
// src/utils/api-endpoints.ts
var NetworkToIndexerAPI = {
mainnet: "https://indexer.mainnet.aptoslabs.com/v1/graphql",
testnet: "https://indexer-testnet.staging.gcp.aptosdev.com/v1/graphql",
devnet: "https://indexer-devnet.staging.gcp.aptosdev.com/v1/graphql"
};
var NetworkToNodeAPI = {
mainnet: "https://fullnode.mainnet.aptoslabs.com/v1",
testnet: "https://fullnode.testnet.aptoslabs.com/v1",
devnet: "https://fullnode.devnet.aptoslabs.com/v1"
};
var NodeAPIToNetwork = {
"https://fullnode.mainnet.aptoslabs.com/v1": "mainnet",
"https://fullnode.testnet.aptoslabs.com/v1": "testnet",
"https://fullnode.devnet.aptoslabs.com/v1": "devnet"
};
var Network = /* @__PURE__ */ ((Network3) => {
Network3["MAINNET"] = "mainnet";
Network3["TESTNET"] = "testnet";
Network3["DEVNET"] = "devnet";
return Network3;
})(Network || {});
// src/utils/hex_string.ts
var import_utils2 = require("@noble/hashes/utils");
var HexString = class {
static fromBuffer(buffer) {
return HexString.fromUint8Array(buffer);
}
static fromUint8Array(arr) {
return new HexString((0, import_utils2.bytesToHex)(arr));
}
static ensure(hexString) {
if (typeof hexString === "string") {
return new HexString(hexString);
}
return hexString;
}
constructor(hexString) {
if (hexString.startsWith("0x")) {
this.hexString = hexString;
} else {
this.hexString = `0x${hexString}`;
}
}
hex() {
return this.hexString;
}
noPrefix() {
return this.hexString.slice(2);
}
toString() {
return this.hex();
}
toShortString() {
const trimmed = this.hexString.replace(/^0x0*/, "");
return `0x${trimmed}`;
}
toUint8Array() {
return Uint8Array.from((0, import_utils2.hexToBytes)(this.noPrefix()));
}
};
// src/aptos_types/index.ts
var aptos_types_exports = {};
__export(aptos_types_exports, {
AccountAddress: () => AccountAddress,
AccountAuthenticator: () => AccountAuthenticator,
AccountAuthenticatorEd25519: () => AccountAuthenticatorEd25519,
AccountAuthenticatorMultiEd25519: () => AccountAuthenticatorMultiEd25519,
ArgumentABI: () => ArgumentABI,
AuthenticationKey: () => AuthenticationKey,
ChainId: () => ChainId,
ChangeSet: () => ChangeSet,
Ed25519PublicKey: () => Ed25519PublicKey,
Ed25519Signature: () => Ed25519Signature,
EntryFunction: () => EntryFunction,
EntryFunctionABI: () => EntryFunctionABI,
FeePayerRawTransaction: () => FeePayerRawTransaction,
Identifier: () => Identifier,
Module: () => Module,
ModuleId: () => ModuleId,
MultiAgentRawTransaction: () => MultiAgentRawTransaction,
MultiEd25519PublicKey: () => MultiEd25519PublicKey,
MultiEd25519Signature: () => MultiEd25519Signature,
MultiSig: () => MultiSig,
MultiSigTransactionPayload: () => MultiSigTransactionPayload,
RawTransaction: () => RawTransaction,
RawTransactionWithData: () => RawTransactionWithData,
RotationProofChallenge: () => RotationProofChallenge,
Script: () => Script,
ScriptABI: () => ScriptABI,
SignedTransaction: () => SignedTransaction,
StructTag: () => StructTag,
Transaction: () => Transaction,
TransactionArgument: () => TransactionArgument,
TransactionArgumentAddress: () => TransactionArgumentAddress,
TransactionArgumentBool: () => TransactionArgumentBool,
TransactionArgumentU128: () => TransactionArgumentU128,
TransactionArgumentU16: () => TransactionArgumentU16,
TransactionArgumentU256: () => TransactionArgumentU256,
TransactionArgumentU32: () => TransactionArgumentU32,
TransactionArgumentU64: () => TransactionArgumentU64,
TransactionArgumentU8: () => TransactionArgumentU8,
TransactionArgumentU8Vector: () => TransactionArgumentU8Vector,
TransactionAuthenticator: () => TransactionAuthenticator,
TransactionAuthenticatorEd25519: () => TransactionAuthenticatorEd25519,
TransactionAuthenticatorFeePayer: () => TransactionAuthenticatorFeePayer,
TransactionAuthenticatorMultiAgent: () => TransactionAuthenticatorMultiAgent,
TransactionAuthenticatorMultiEd25519: () => TransactionAuthenticatorMultiEd25519,
TransactionPayload: () => TransactionPayload,
TransactionPayloadEntryFunction: () => TransactionPayloadEntryFunction,
TransactionPayloadMultisig: () => TransactionPayloadMultisig,
TransactionPayloadScript: () => TransactionPayloadScript,
TransactionScriptABI: () => TransactionScriptABI,
TypeArgumentABI: () => TypeArgumentABI,
TypeTag: () => TypeTag,
TypeTagAddress: () => TypeTagAddress,
TypeTagBool: () => TypeTagBool,
TypeTagParser: () => TypeTagParser,
TypeTagParserError: () => TypeTagParserError,
TypeTagSigner: () => TypeTagSigner,
TypeTagStruct: () => TypeTagStruct,
TypeTagU128: () => TypeTagU128,
TypeTagU16: () => TypeTagU16,
TypeTagU256: () => TypeTagU256,
TypeTagU32: () => TypeTagU32,
TypeTagU64: () => TypeTagU64,
TypeTagU8: () => TypeTagU8,
TypeTagVector: () => TypeTagVector,
UserTransaction: () => UserTransaction,
WriteSet: () => WriteSet,
objectStructTag: () => objectStructTag,
optionStructTag: () => optionStructTag,
stringStructTag: () => stringStructTag
});
// src/bcs/index.ts
var bcs_exports = {};
__export(bcs_exports, {
Deserializer: () => Deserializer,
Serializer: () => Serializer,
bcsSerializeBool: () => bcsSerializeBool,
bcsSerializeBytes: () => bcsSerializeBytes,
bcsSerializeFixedBytes: () => bcsSerializeFixedBytes,
bcsSerializeStr: () => bcsSerializeStr,
bcsSerializeU128: () => bcsSerializeU128,
bcsSerializeU16: () => bcsSerializeU16,
bcsSerializeU256: () => bcsSerializeU256,
bcsSerializeU32: () => bcsSerializeU32,
bcsSerializeU8: () => bcsSerializeU8,
bcsSerializeUint64: () => bcsSerializeUint64,
bcsToBytes: () => bcsToBytes,
deserializeVector: () => deserializeVector,
serializeVector: () => serializeVector,
serializeVectorWithFunc: () => serializeVectorWithFunc
});
// src/bcs/consts.ts
var MAX_U8_NUMBER = 2 ** 8 - 1;
var MAX_U16_NUMBER = 2 ** 16 - 1;
var MAX_U32_NUMBER = 2 ** 32 - 1;
var MAX_U64_BIG_INT = BigInt(2 ** 64) - BigInt(1);
var MAX_U128_BIG_INT = BigInt(2 ** 128) - BigInt(1);
var MAX_U256_BIG_INT = BigInt(2 ** 256) - BigInt(1);
// src/bcs/serializer.ts
var Serializer = class {
constructor() {
this.buffer = new ArrayBuffer(64);
this.offset = 0;
}
ensureBufferWillHandleSize(bytes) {
while (this.buffer.byteLength < this.offset + bytes) {
const newBuffer = new ArrayBuffer(this.buffer.byteLength * 2);
new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
this.buffer = newBuffer;
}
}
serialize(values) {
this.ensureBufferWillHandleSize(values.length);
new Uint8Array(this.buffer, this.offset).set(values);
this.offset += values.length;
}
serializeWithFunction(fn, bytesLength, value) {
this.ensureBufferWillHandleSize(bytesLength);
const dv = new DataView(this.buffer, this.offset);
fn.apply(dv, [0, value, true]);
this.offset += bytesLength;
}
serializeStr(value) {
const textEncoder = new TextEncoder();
this.serializeBytes(textEncoder.encode(value));
}
serializeBytes(value) {
this.serializeU32AsUleb128(value.length);
this.serialize(value);
}
serializeFixedBytes(value) {
this.serialize(value);
}
serializeBool(value) {
if (typeof value !== "boolean") {
throw new Error("Value needs to be a boolean");
}
const byteValue = value ? 1 : 0;
this.serialize(new Uint8Array([byteValue]));
}
serializeU8(value) {
this.serialize(new Uint8Array([value]));
}
serializeU16(value) {
this.serializeWithFunction(DataView.prototype.setUint16, 2, value);
}
serializeU32(value) {
this.serializeWithFunction(DataView.prototype.setUint32, 4, value);
}
serializeU64(value) {
const low = BigInt(value.toString()) & BigInt(MAX_U32_NUMBER);
const high = BigInt(value.toString()) >> BigInt(32);
this.serializeU32(Number(low));
this.serializeU32(Number(high));
}
serializeU128(value) {
const low = BigInt(value.toString()) & MAX_U64_BIG_INT;
const high = BigInt(value.toString()) >> BigInt(64);
this.serializeU64(low);
this.serializeU64(high);
}
serializeU256(value) {
const low = BigInt(value.toString()) & MAX_U128_BIG_INT;
const high = BigInt(value.toString()) >> BigInt(128);
this.serializeU128(low);
this.serializeU128(high);
}
serializeU32AsUleb128(val) {
let value = val;
const valueArray = [];
while (value >>> 7 !== 0) {
valueArray.push(value & 127 | 128);
value >>>= 7;
}
valueArray.push(value);
this.serialize(new Uint8Array(valueArray));
}
getBytes() {
return new Uint8Array(this.buffer).slice(0, this.offset);
}
};
__decorateClass([
checkNumberRange(0, MAX_U8_NUMBER)
], Serializer.prototype, "serializeU8", 1);
__decorateClass([
checkNumberRange(0, MAX_U16_NUMBER)
], Serializer.prototype, "serializeU16", 1);
__decorateClass([
checkNumberRange(0, MAX_U32_NUMBER)
], Serializer.prototype, "serializeU32", 1);
__decorateClass([
checkNumberRange(BigInt(0), MAX_U64_BIG_INT)
], Serializer.prototype, "serializeU64", 1);
__decorateClass([
checkNumberRange(BigInt(0), MAX_U128_BIG_INT)
], Serializer.prototype, "serializeU128", 1);
__decorateClass([
checkNumberRange(BigInt(0), MAX_U256_BIG_INT)
], Serializer.prototype, "serializeU256", 1);
__decorateClass([
checkNumberRange(0, MAX_U32_NUMBER)
], Serializer.prototype, "serializeU32AsUleb128", 1);
function checkNumberRange(minValue, maxValue, message) {
return (target, propertyKey, descriptor) => {
const childFunction = descriptor.value;
descriptor.value = function deco(value) {
const valueBigInt = BigInt(value.toString());
if (valueBigInt > BigInt(maxValue.toString()) || valueBigInt < BigInt(minValue.toString())) {
throw new Error(message || "Value is out of range");
}
childFunction.apply(this, [value]);
};
return descriptor;
};
}
// src/bcs/deserializer.ts
var Deserializer = class {
constructor(data) {
this.buffer = new ArrayBuffer(data.length);
new Uint8Array(this.buffer).set(data, 0);
this.offset = 0;
}
read(length) {
if (this.offset + length > this.buffer.byteLength) {
throw new Error("Reached to the end of buffer");
}
const bytes = this.buffer.slice(this.offset, this.offset + length);
this.offset += length;
return bytes;
}
deserializeStr() {
const value = this.deserializeBytes();
const textDecoder = new TextDecoder();
return textDecoder.decode(value);
}
deserializeBytes() {
const len = this.deserializeUleb128AsU32();
return new Uint8Array(this.read(len));
}
deserializeFixedBytes(len) {
return new Uint8Array(this.read(len));
}
deserializeBool() {
const bool = new Uint8Array(this.read(1))[0];
if (bool !== 1 && bool !== 0) {
throw new Error("Invalid boolean value");
}
return bool === 1;
}
deserializeU8() {
return new DataView(this.read(1)).getUint8(0);
}
deserializeU16() {
return new DataView(this.read(2)).getUint16(0, true);
}
deserializeU32() {
return new DataView(this.read(4)).getUint32(0, true);
}
deserializeU64() {
const low = this.deserializeU32();
const high = this.deserializeU32();
return BigInt(BigInt(high) << BigInt(32) | BigInt(low));
}
deserializeU128() {
const low = this.deserializeU64();
const high = this.deserializeU64();
return BigInt(high << BigInt(64) | low);
}
deserializeU256() {
const low = this.deserializeU128();
const high = this.deserializeU128();
return BigInt(high << BigInt(128) | low);
}
deserializeUleb128AsU32() {
let value = BigInt(0);
let shift = 0;
while (value < MAX_U32_NUMBER) {
const byte = this.deserializeU8();
value |= BigInt(byte & 127) << BigInt(shift);
if ((byte & 128) === 0) {
break;
}
shift += 7;
}
if (value > MAX_U32_NUMBER) {
throw new Error("Overflow while parsing uleb128-encoded uint32 value");
}
return Number(value);
}
};
// src/bcs/helper.ts
function serializeVector(value, serializer) {
serializer.serializeU32AsUleb128(value.length);
value.forEach((item) => {
item.serialize(serializer);
});
}
function serializeVectorWithFunc(value, func) {
const serializer = new Serializer();
serializer.serializeU32AsUleb128(value.length);
const f = serializer[func];
value.forEach((item) => {
f.call(serializer, item);
});
return serializer.getBytes();
}
function deserializeVector(deserializer, cls) {
const length = deserializer.deserializeUleb128AsU32();
const list = [];
for (let i = 0; i < length; i += 1) {
list.push(cls.deserialize(deserializer));
}
return list;
}
function bcsToBytes(value) {
const serializer = new Serializer();
value.serialize(serializer);
return serializer.getBytes();
}
function bcsSerializeUint64(value) {
const serializer = new Serializer();
serializer.serializeU64(value);
return serializer.getBytes();
}
function bcsSerializeU8(value) {
const serializer = new Serializer();
serializer.serializeU8(value);
return serializer.getBytes();
}
function bcsSerializeU16(value) {
const serializer = new Serializer();
serializer.serializeU16(value);
return serializer.getBytes();
}
function bcsSerializeU32(value) {
const serializer = new Serializer();
serializer.serializeU32(value);
return serializer.getBytes();
}
function bcsSerializeU128(value) {
const serializer = new Serializer();
serializer.serializeU128(value);
return serializer.getBytes();
}
function bcsSerializeU256(value) {
const serializer = new Serializer();
serializer.serializeU256(value);
return serializer.getBytes();
}
function bcsSerializeBool(value) {
const serializer = new Serializer();
serializer.serializeBool(value);
return serializer.getBytes();
}
function bcsSerializeStr(value) {
const serializer = new Serializer();
serializer.serializeStr(value);
return serializer.getBytes();
}
function bcsSerializeBytes(value) {
const serializer = new Serializer();
serializer.serializeBytes(value);
return serializer.getBytes();
}
function bcsSerializeFixedBytes(value) {
const serializer = new Serializer();
serializer.serializeFixedBytes(value);
return serializer.getBytes();
}
// src/aptos_types/transaction.ts
var import_sha3 = require("@noble/hashes/sha3");
// src/aptos_types/account_address.ts
var _AccountAddress = class {
constructor(address) {
if (address.length !== _AccountAddress.LENGTH) {
throw new Error("Expected address of length 32");
}
this.address = address;
}
static fromHex(addr) {
let address = HexString.ensure(addr);
if (address.noPrefix().length % 2 !== 0) {
address = new HexString(`0${address.noPrefix()}`);
}
const addressBytes = address.toUint8Array();
if (addressBytes.length > _AccountAddress.LENGTH) {
throw new Error("Hex string is too long. Address's length is 32 bytes.");
} else if (addressBytes.length === _AccountAddress.LENGTH) {
return new _AccountAddress(addressBytes);
}
const res = new Uint8Array(_AccountAddress.LENGTH);
res.set(addressBytes, _AccountAddress.LENGTH - addressBytes.length);
return new _AccountAddress(res);
}
static isValid(addr) {
if (addr === "") {
return false;
}
let address = HexString.ensure(addr);
if (address.noPrefix().length % 2 !== 0) {
address = new HexString(`0${address.noPrefix()}`);
}
const addressBytes = address.toUint8Array();
return addressBytes.length <= _AccountAddress.LENGTH;
}
toHexString() {
return HexString.fromUint8Array(this.address).hex();
}
serialize(serializer) {
serializer.serializeFixedBytes(this.address);
}
static deserialize(deserializer) {
return new _AccountAddress(deserializer.deserializeFixedBytes(_AccountAddress.LENGTH));
}
static standardizeAddress(address) {
const lowercaseAddress = address.toLowerCase();
const addressWithoutPrefix = lowercaseAddress.startsWith("0x") ? lowercaseAddress.slice(2) : lowercaseAddress;
const addressWithPadding = addressWithoutPrefix.padStart(64, "0");
return `0x${addressWithPadding}`;
}
};
var AccountAddress = _AccountAddress;
AccountAddress.LENGTH = 32;
AccountAddress.CORE_CODE_ADDRESS = _AccountAddress.fromHex("0x1");
// src/aptos_types/ed25519.ts
var _Ed25519PublicKey = class {
constructor(value) {
if (value.length !== _Ed25519PublicKey.LENGTH) {
throw new Error(`Ed25519PublicKey length should be ${_Ed25519PublicKey.LENGTH}`);
}
this.value = value;
}
toBytes() {
return this.value;
}
serialize(serializer) {
serializer.serializeBytes(this.value);
}
static deserialize(deserializer) {
const value = deserializer.deserializeBytes();
return new _Ed25519PublicKey(value);
}
};
var Ed25519PublicKey = _Ed25519PublicKey;
Ed25519PublicKey.LENGTH = 32;
var _Ed25519Signature = class {
constructor(value) {
this.value = value;
if (value.length !== _Ed25519Signature.LENGTH) {
throw new Error(`Ed25519Signature length should be ${_Ed25519Signature.LENGTH}`);
}
}
serialize(serializer) {
serializer.serializeBytes(this.value);
}
static deserialize(deserializer) {
const value = deserializer.deserializeBytes();
return new _Ed25519Signature(value);
}
};
var Ed25519Signature = _Ed25519Signature;
Ed25519Signature.LENGTH = 64;
// src/aptos_types/multi_ed25519.ts
var MAX_SIGNATURES_SUPPORTED = 32;
var MultiEd25519PublicKey = class {
constructor(public_keys, threshold) {
this.public_keys = public_keys;
this.threshold = threshold;
if (threshold > MAX_SIGNATURES_SUPPORTED) {
throw new Error(`"threshold" cannot be larger than ${MAX_SIGNATURES_SUPPORTED}`);
}
}
toBytes() {
const bytes = new Uint8Array(this.public_keys.length * Ed25519PublicKey.LENGTH + 1);
this.public_keys.forEach((k, i) => {
bytes.set(k.value, i * Ed25519PublicKey.LENGTH);
});
bytes[this.public_keys.length * Ed25519PublicKey.LENGTH] = this.threshold;
return bytes;
}
serialize(serializer) {
serializer.serializeBytes(this.toBytes());
}
static deserialize(deserializer) {
const bytes = deserializer.deserializeBytes();
const threshold = bytes[bytes.length - 1];
const keys = [];
for (let i = 0; i < bytes.length - 1; i += Ed25519PublicKey.LENGTH) {
const begin = i;
keys.push(new Ed25519PublicKey(bytes.subarray(begin, begin + Ed25519PublicKey.LENGTH)));
}
return new MultiEd25519PublicKey(keys, threshold);
}
};
var _MultiEd25519Signature = class {
constructor(signatures, bitmap) {
this.signatures = signatures;
this.bitmap = bitmap;
if (bitmap.length !== _MultiEd25519Signature.BITMAP_LEN) {
throw new Error(`"bitmap" length should be ${_MultiEd25519Signature.BITMAP_LEN}`);
}
}
toBytes() {
const bytes = new Uint8Array(this.signatures.length * Ed25519Signature.LENGTH + _MultiEd25519Signature.BITMAP_LEN);
this.signatures.forEach((k, i) => {
bytes.set(k.value, i * Ed25519Signature.LENGTH);
});
bytes.set(this.bitmap, this.signatures.length * Ed25519Signature.LENGTH);
return bytes;
}
static createBitmap(bits) {
const firstBitInByte = 128;
const bitmap = new Uint8Array([0, 0, 0, 0]);
const dupCheckSet = /* @__PURE__ */ new Set();
bits.forEach((bit) => {
if (bit >= MAX_SIGNATURES_SUPPORTED) {
throw new Error(`Invalid bit value ${bit}.`);
}
if (dupCheckSet.has(bit)) {
throw new Error("Duplicated bits detected.");
}
dupCheckSet.add(bit);
const byteOffset = Math.floor(bit / 8);
let byte = bitmap[byteOffset];
byte |= firstBitInByte >> bit % 8;
bitmap[byteOffset] = byte;
});
return bitmap;
}
serialize(serializer) {
serializer.serializeBytes(this.toBytes());
}
static deserialize(deserializer) {
const bytes = deserializer.deserializeBytes();
const bitmap = bytes.subarray(bytes.length - 4);
const sigs = [];
for (let i = 0; i < bytes.length - bitmap.length; i += Ed25519Signature.LENGTH) {
const begin = i;
sigs.push(new Ed25519Signature(bytes.subarray(begin, begin + Ed25519Signature.LENGTH)));
}
return new _MultiEd25519Signature(sigs, bitmap);
}
};
var MultiEd25519Signature = _MultiEd25519Signature;
MultiEd25519Signature.BITMAP_LEN = 4;
// src/aptos_types/authenticator.ts
var TransactionAuthenticator = class {
static deserialize(deserializer) {
const index = deserializer.deserializeUleb128AsU32();
switch (index) {
case 0:
return TransactionAuthenticatorEd25519.load(deserializer);
case 1:
return TransactionAuthenticatorMultiEd25519.load(deserializer);
case 2:
return TransactionAuthenticatorMultiAgent.load(deserializer);
case 3:
return TransactionAuthenticatorFeePayer.load(deserializer);
default:
throw new Error(`Unknown variant index for TransactionAuthenticator: ${index}`);
}
}
};
var TransactionAuthenticatorEd25519 = class extends TransactionAuthenticator {
constructor(public_key, signature) {
super();
this.public_key = public_key;
this.signature = signature;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(0);
this.public_key.serialize(serializer);
this.signature.serialize(serializer);
}
static load(deserializer) {
const public_key = Ed25519PublicKey.deserialize(deserializer);
const signature = Ed25519Signature.deserialize(deserializer);
return new TransactionAuthenticatorEd25519(public_key, signature);
}
};
var TransactionAuthenticatorMultiEd25519 = class extends TransactionAuthenticator {
constructor(public_key, signature) {
super();
this.public_key = public_key;
this.signature = signature;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(1);
this.public_key.serialize(serializer);
this.signature.serialize(serializer);
}
static load(deserializer) {
const public_key = MultiEd25519PublicKey.deserialize(deserializer);
const signature = MultiEd25519Signature.deserialize(deserializer);
return new TransactionAuthenticatorMultiEd25519(public_key, signature);
}
};
var TransactionAuthenticatorMultiAgent = class extends TransactionAuthenticator {
constructor(sender, secondary_signer_addresses, secondary_signers) {
super();
this.sender = sender;
this.secondary_signer_addresses = secondary_signer_addresses;
this.secondary_signers = secondary_signers;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(2);
this.sender.serialize(serializer);
serializeVector(this.secondary_signer_addresses, serializer);
serializeVector(this.secondary_signers, serializer);
}
static load(deserializer) {
const sender = AccountAuthenticator.deserialize(deserializer);
const secondary_signer_addresses = deserializeVector(deserializer, AccountAddress);
const secondary_signers = deserializeVector(deserializer, AccountAuthenticator);
return new TransactionAuthenticatorMultiAgent(sender, secondary_signer_addresses, secondary_signers);
}
};
var TransactionAuthenticatorFeePayer = class extends TransactionAuthenticator {
constructor(sender, secondary_signer_addresses, secondary_signers, fee_payer) {
super();
this.sender = sender;
this.secondary_signer_addresses = secondary_signer_addresses;
this.secondary_signers = secondary_signers;
this.fee_payer = fee_payer;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(3);
this.sender.serialize(serializer);
serializeVector(this.secondary_signer_addresses, serializer);
serializeVector(this.secondary_signers, serializer);
this.fee_payer.address.serialize(serializer);
this.fee_payer.authenticator.serialize(serializer);
}
static load(deserializer) {
const sender = AccountAuthenticator.deserialize(deserializer);
const secondary_signer_addresses = deserializeVector(deserializer, AccountAddress);
const secondary_signers = deserializeVector(deserializer, AccountAuthenticator);
const address = AccountAddress.deserialize(deserializer);
const authenticator = AccountAuthenticator.deserialize(deserializer);
const fee_payer = { address, authenticator };
return new TransactionAuthenticatorFeePayer(sender, secondary_signer_addresses, secondary_signers, fee_payer);
}
};
var AccountAuthenticator = class {
static deserialize(deserializer) {
const index = deserializer.deserializeUleb128AsU32();
switch (index) {
case 0:
return AccountAuthenticatorEd25519.load(deserializer);
case 1:
return AccountAuthenticatorMultiEd25519.load(deserializer);
default:
throw new Error(`Unknown variant index for AccountAuthenticator: ${index}`);
}
}
};
var AccountAuthenticatorEd25519 = class extends AccountAuthenticator {
constructor(public_key, signature) {
super();
this.public_key = public_key;
this.signature = signature;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(0);
this.public_key.serialize(serializer);
this.signature.serialize(serializer);
}
static load(deserializer) {
const public_key = Ed25519PublicKey.deserialize(deserializer);
const signature = Ed25519Signature.deserialize(deserializer);
return new AccountAuthenticatorEd25519(public_key, signature);
}
};
var AccountAuthenticatorMultiEd25519 = class extends AccountAuthenticator {
constructor(public_key, signature) {
super();
this.public_key = public_key;
this.signature = signature;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(1);
this.public_key.serialize(serializer);
this.signature.serialize(serializer);
}
static load(deserializer) {
const public_key = MultiEd25519PublicKey.deserialize(deserializer);
const signature = MultiEd25519Signature.deserialize(deserializer);
return new AccountAuthenticatorMultiEd25519(public_key, signature);
}
};
// src/aptos_types/identifier.ts
var Identifier = class {
constructor(value) {
this.value = value;
}
serialize(serializer) {
serializer.serializeStr(this.value);
}
static deserialize(deserializer) {
const value = deserializer.deserializeStr();
return new Identifier(value);
}
};
// src/aptos_types/type_tag.ts
var TypeTag = class {
static deserialize(deserializer) {
const index = deserializer.deserializeUleb128AsU32();
switch (index) {
case 0:
return TypeTagBool.load(deserializer);
case 1:
return TypeTagU8.load(deserializer);
case 2:
return TypeTagU64.load(deserializer);
case 3:
return TypeTagU128.load(deserializer);
case 4:
return TypeTagAddress.load(deserializer);
case 5:
return TypeTagSigner.load(deserializer);
case 6:
return TypeTagVector.load(deserializer);
case 7:
return TypeTagStruct.load(deserializer);
case 8:
return TypeTagU16.load(deserializer);
case 9:
return TypeTagU32.load(deserializer);
case 10:
return TypeTagU256.load(deserializer);
default:
throw new Error(`Unknown variant index for TypeTag: ${index}`);
}
}
};
var TypeTagBool = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(0);
}
static load(_deserializer) {
return new TypeTagBool();
}
};
var TypeTagU8 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(1);
}
static load(_deserializer) {
return new TypeTagU8();
}
};
var TypeTagU16 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(8);
}
static load(_deserializer) {
return new TypeTagU16();
}
};
var TypeTagU32 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(9);
}
static load(_deserializer) {
return new TypeTagU32();
}
};
var TypeTagU64 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(2);
}
static load(_deserializer) {
return new TypeTagU64();
}
};
var TypeTagU128 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(3);
}
static load(_deserializer) {
return new TypeTagU128();
}
};
var TypeTagU256 = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(10);
}
static load(_deserializer) {
return new TypeTagU256();
}
};
var TypeTagAddress = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(4);
}
static load(_deserializer) {
return new TypeTagAddress();
}
};
var TypeTagSigner = class extends TypeTag {
serialize(serializer) {
serializer.serializeU32AsUleb128(5);
}
static load(_deserializer) {
return new TypeTagSigner();
}
};
var TypeTagVector = class extends TypeTag {
constructor(value) {
super();
this.value = value;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(6);
this.value.serialize(serializer);
}
static load(deserializer) {
const value = TypeTag.deserialize(deserializer);
return new TypeTagVector(value);
}
};
var TypeTagStruct = class extends TypeTag {
constructor(value) {
super();
this.value = value;
}
serialize(serializer) {
serializer.serializeU32AsUleb128(7);
this.value.serialize(serializer);
}
static load(deserializer) {
const value = StructTag.deserialize(deserializer);
return new TypeTagStruct(value);
}
isStringTypeTag() {
if (this.value.module_name.value === "string" && this.value.name.value === "String" && this.value.address.toHexString() === AccountAddress.CORE_CODE_ADDRESS.toHexString()) {
return true;
}
return false;
}
};
var StructTag = class {
constructor(address, module_name, name, type_args) {
this.address = address;
this.module_name = module_name;
this.name = name;
this.type_args = type_args;
}
static fromString(structTag) {
const typeTagStruct = new TypeTagParser(structTag).parseTypeTag();
return new StructTag(
typeTagStruct.value.address,
typeTagStruct.value.module_name,
typeTagStruct.value.name,
typeTagStruct.value.type_args
);
}
serialize(serializer) {
this.address.serialize(serializer);
this.module_name.serialize(serializer);
this.name.serialize(serializer);
serializeVector(this.type_args, serializer);
}
static deserialize(deserializer) {
const address = AccountAddress.deserialize(deserializer);
const moduleName = Identifier.deserialize(deserializer);
const name = Identifier.deserialize(deserializer);
const typeArgs = deserializeVector(deserializer, TypeTag);
return new StructTag(address, moduleName, name, typeArgs);
}
};
var stringStructTag = new StructTag(
AccountAddress.fromHex("0x1"),
new Identifier("string"),
new Identifier("String"),
[]
);
function optionStructTag(typeArg) {
return new StructTag(AccountAddress.fromHex("0x1"), new Identifier("option"), new Identifier("Option"), [typeArg]);
}
function objectStructTag(typeArg) {
return new StructTag(AccountAddress.fromHex("0x1"), new Identifier("object"), new Identifier("Object"), [typeArg]);
}
function bail(message) {
throw new TypeTagParserError(message);
}
function isWhiteSpace(c) {
if (c.match(/\s/)) {
return true;
}
return false;
}
function isValidAlphabetic(c) {
if (c.match(/[_A-Za-z0-9]/g)) {
return true;
}
return false;
}
function isGeneric(c) {
if (c.match(/T\d+/g)) {
return true;
}
return false;
}
function nextToken(tagStr, pos) {
const c = tagStr[pos];
if (c === ":") {
if (tagStr.slice(pos, pos + 2) === "::") {
return [["COLON", "::"], 2];
}
bail("Unrecognized token.");
} else if (c === "<") {
return [["LT", "<"], 1];
} else if (c === ">") {
return [["GT", ">"], 1];
} else if (c === ",") {
return [["COMMA", ","], 1];
} else if (isWhiteSpace(c)) {
let res = "";
for (let i = pos; i < tagStr.length; i += 1) {
const char = tagStr[i];
if (isWhiteSpace(char)) {
res = `${res}${char}`;
} else {
break;
}
}
return [["SPACE", res], res.length];
} else if (isValidAlphabetic(c)) {
let res = "";
for (let i = pos; i < tagStr.length; i += 1) {
const char = tagStr[i];
if (isValidAlphabetic(char)) {
res = `${res}${char}`;
} else {
break;
}
}
if (isGeneric(res)) {
return [["GENERIC", res], res.length];
}
return [["IDENT", res], res.length];
}
throw new Error("Unrecognized token.");
}
function tokenize(tagStr) {
let pos = 0;
const tokens = [];
while (pos < tagStr.length) {
const [token, size] = nextToken(tagStr, pos);
if (token[0] !== "SPACE") {
tokens.push(token);
}
pos += size;
}
return tokens;
}
var TypeTagParser = class {
constructor(tagStr, typeTags) {
this.typeTags = [];
this.tokens = tokenize(tagStr);
this.typeTags = typeTags || [];
}
consume(targetToken) {
const token = this.tokens.shift();
if (!token || token[1] !== targetToken) {
bail("Invalid type tag.");
}
}
consumeWholeGeneric() {
this.consume("<");
while (this.tokens[0][1] !== ">") {
if (this.tokens[0][1] === "<") {
this.consumeWholeGeneric();
}
this.tokens.shift();
}
this.consume(">");
}
parseCommaList(endToken, allowTraillingComma) {
const res = [];
if (this.tokens.length <= 0) {
bail("Invalid type tag.");
}
while (this.tokens[0][1] !== endToken) {
res.push(this.parseTypeTag());
if (this.tokens.length > 0 && this.tokens[0][1] === endToken) {
break;
}
this.consume(",");
if (this.tokens.length > 0 && this.tokens[0][1] === endToken && allowTraillingComma) {
break;
}
if (this.tokens.length <= 0) {
bail("Invalid type tag.");
}
}
return res;
}
parseTypeTag() {
if (this.tokens.length === 0) {
bail("Invalid type tag.");
}
const [tokenTy, tokenVal] = this.tokens.shift();
if (tokenVal === "u8") {
return new TypeTagU8();
}
if (tokenVal === "u16") {
return new TypeTagU16();
}
if (tokenVal === "u32") {
return new TypeTagU32();
}
if (tokenVal === "u64") {
return new TypeTagU64();
}
if (tokenVal === "u128") {
return new TypeTagU128();
}
if (tokenVal === "u256") {
return new TypeTagU256();
}
if (tokenVal === "bool") {
return new TypeTagBool();
}
if (tokenVal === "address") {
return new TypeTagAddress();
}
if (tokenVal === "vector") {
this.consume("<");
const res = this.parseTypeTag();
this.consume(">");
return new TypeTagVector(res);
}
if (tokenVal === "string") {
return stringStructTag;
}
if (tokenTy === "IDENT" && (tokenVal.startsWith("0x") || tokenVal.startsWith("0X"))) {
const address = AccountAddress.fromHex(tok