UNPKG

aptos

Version:
1,520 lines (1,494 loc) 309 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; 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/account/aptos_account.ts import nacl2 from "tweetnacl"; import * as bip39 from "@scure/bip39"; import { bytesToHex as bytesToHex2 } from "@noble/hashes/utils"; import { sha256 } from "@noble/hashes/sha256"; import { sha3_256 as sha3Hash3 } from "@noble/hashes/sha3"; // src/utils/hd-key.ts import nacl from "tweetnacl"; import { hmac } from "@noble/hashes/hmac"; import { sha512 } from "@noble/hashes/sha512"; import { hexToBytes } from "@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 = hmac.create(sha512, HMAC_KEY); const I = h.update(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 = hmac.create(sha512, chainCode).update(data).digest(); const IL = I.slice(0, 32); const IR = I.slice(32); return { key: IL, chainCode: IR }; }; var getPublicKey = (privateKey, withZeroByte = true) => { const keyPair = nacl.sign.keyPair.fromSeed(privateKey); const signPk = keyPair.secretKey.subarray(32); const zero = new Uint8Array([0]); return withZeroByte ? new Uint8Array([...zero, ...signPk]) : signPk; }; 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.21.0"; // src/utils/misc.ts async function sleep(timeMs) { return new Promise((resolve) => { setTimeout(resolve, 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 import aptosClient from "@aptos-labs/aptos-client"; // 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/core.ts 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 request(url, method, body, contentType, params, overrides) { 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 response = await aptosClient({ url, method, body, params, headers, overrides }); return response; } async function aptosRequest(options) { const { url, endpoint, method, body, contentType, params, overrides } = options; const fullEndpoint = `${url}/${endpoint != null ? endpoint : ""}`; const response = await request(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 (result.status >= 200 && result.status < 300) { return result; } const errorMessage = errors[result.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", local: "http://127.0.0.1:8090/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", local: "http://127.0.0.1:8080/v1" }; var NodeAPIToNetwork = { "https://fullnode.mainnet.aptoslabs.com/v1": "mainnet", "https://fullnode.testnet.aptoslabs.com/v1": "testnet", "https://fullnode.devnet.aptoslabs.com/v1": "devnet", "http://127.0.0.1:8080/v1": "local" }; var Network = /* @__PURE__ */ ((Network3) => { Network3["MAINNET"] = "mainnet"; Network3["TESTNET"] = "testnet"; Network3["DEVNET"] = "devnet"; Network3["LOCAL"] = "local"; return Network3; })(Network || {}); // src/utils/hex_string.ts import { bytesToHex, hexToBytes as hexToBytes2 } from "@noble/hashes/utils"; var HexString = class _HexString { /** * Creates new hex string from Buffer * @param buffer A buffer to convert * @returns New HexString */ static fromBuffer(buffer) { return _HexString.fromUint8Array(buffer); } /** * Creates new hex string from Uint8Array * @param arr Uint8Array to convert * @returns New HexString */ static fromUint8Array(arr) { return new _HexString(bytesToHex(arr)); } /** * Ensures `hexString` is instance of `HexString` class * @param hexString String to check * @returns New HexString if `hexString` is regular string or `hexString` if it is HexString instance * @example * ``` * const regularString = "string"; * const hexString = new HexString("string"); // "0xstring" * HexString.ensure(regularString); // "0xstring" * HexString.ensure(hexString); // "0xstring" * ``` */ static ensure(hexString) { if (typeof hexString === "string") { return new _HexString(hexString); } return hexString; } /** * Creates new HexString instance from regular string. If specified string already starts with "0x" prefix, * it will not add another one * @param hexString String to convert * @example * ``` * const string = "string"; * new HexString(string); // "0xstring" * ``` */ constructor(hexString) { if (hexString.startsWith("0x")) { this.hexString = hexString; } else { this.hexString = `0x${hexString}`; } } /** * Getter for inner hexString * @returns Inner hex string */ hex() { return this.hexString; } /** * Getter for inner hexString without prefix * @returns Inner hex string without prefix * @example * ``` * const hexString = new HexString("string"); // "0xstring" * hexString.noPrefix(); // "string" * ``` */ noPrefix() { return this.hexString.slice(2); } /** * Overrides default `toString` method * @returns Inner hex string */ toString() { return this.hex(); } /** * Trimmes extra zeroes in the begining of a string * @returns Inner hexString without leading zeroes * @example * ``` * new HexString("0x000000string").toShortString(); // result = "0xstring" * ``` */ toShortString() { const trimmed = this.hexString.replace(/^0x0*/, ""); return `0x${trimmed}`; } /** * Converts hex string to a Uint8Array * @returns Uint8Array from inner hexString without prefix */ toUint8Array() { return Uint8Array.from(hexToBytes2(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; } /** * Serializes a string. UTF8 string is supported. Serializes the string's bytes length "l" first, * and then serializes "l" bytes of the string content. * * BCS layout for "string": string_length | string_content. string_length is the bytes length of * the string that is uleb128 encoded. string_length is a u32 integer. * * @example * ```ts * const serializer = new Serializer(); * serializer.serializeStr("çå∞≠¢õß∂ƒ∫"); * assert(serializer.getBytes() === new Uint8Array([24, 0xc3, 0xa7, 0xc3, 0xa5, 0xe2, 0x88, 0x9e, * 0xe2, 0x89, 0xa0, 0xc2, 0xa2, 0xc3, 0xb5, 0xc3, 0x9f, 0xe2, 0x88, 0x82, 0xc6, 0x92, 0xe2, 0x88, 0xab])); * ``` */ serializeStr(value) { const textEncoder = new TextEncoder(); this.serializeBytes(textEncoder.encode(value)); } /** * Serializes an array of bytes. * * BCS layout for "bytes": bytes_length | bytes. bytes_length is the length of the bytes array that is * uleb128 encoded. bytes_length is a u32 integer. */ serializeBytes(value) { this.serializeU32AsUleb128(value.length); this.serialize(value); } /** * Serializes an array of bytes with known length. Therefore length doesn't need to be * serialized to help deserialization. When deserializing, the number of * bytes to deserialize needs to be passed in. */ serializeFixedBytes(value) { this.serialize(value); } /** * Serializes a boolean value. * * BCS layout for "boolean": One byte. "0x01" for True and "0x00" for False. */ 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)); } /** * Returns the buffered bytes */ 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; } /** * Deserializes a string. UTF8 string is supported. Reads the string's bytes length "l" first, * and then reads "l" bytes of content. Decodes the byte array into a string. * * BCS layout for "string": string_length | string_content. string_length is the bytes length of * the string that is uleb128 encoded. string_length is a u32 integer. * * @example * ```ts * const deserializer = new Deserializer(new Uint8Array([24, 0xc3, 0xa7, 0xc3, 0xa5, 0xe2, 0x88, 0x9e, * 0xe2, 0x89, 0xa0, 0xc2, 0xa2, 0xc3, 0xb5, 0xc3, 0x9f, 0xe2, 0x88, 0x82, 0xc6, 0x92, 0xe2, 0x88, 0xab])); * assert(deserializer.deserializeStr() === "çå∞≠¢õß∂ƒ∫"); * ``` */ deserializeStr() { const value = this.deserializeBytes(); const textDecoder = new TextDecoder(); return textDecoder.decode(value); } /** * Deserializes an array of bytes. * * BCS layout for "bytes": bytes_length | bytes. bytes_length is the length of the bytes array that is * uleb128 encoded. bytes_length is a u32 integer. */ deserializeBytes() { const len = this.deserializeUleb128AsU32(); return new Uint8Array(this.read(len)); } /** * Deserializes an array of bytes. The number of bytes to read is already known. * */ deserializeFixedBytes(len) { return new Uint8Array(this.read(len)); } /** * Deserializes a boolean value. * * BCS layout for "boolean": One byte. "0x01" for True and "0x00" for False. */ deserializeBool() { const bool = new Uint8Array(this.read(1))[0]; if (bool !== 1 && bool !== 0) { throw new Error("Invalid boolean value"); } return bool === 1; } /** * Deserializes a uint8 number. * * BCS layout for "uint8": One byte. Binary format in little-endian representation. */ deserializeU8() { return new DataView(this.read(1)).getUint8(0); } /** * Deserializes a uint16 number. * * BCS layout for "uint16": Two bytes. Binary format in little-endian representation. * @example * ```ts * const deserializer = new Deserializer(new Uint8Array([0x34, 0x12])); * assert(deserializer.deserializeU16() === 4660); * ``` */ deserializeU16() { return new DataView(this.read(2)).getUint16(0, true); } /** * Deserializes a uint32 number. * * BCS layout for "uint32": Four bytes. Binary format in little-endian representation. * @example * ```ts * const deserializer = new Deserializer(new Uint8Array([0x78, 0x56, 0x34, 0x12])); * assert(deserializer.deserializeU32() === 305419896); * ``` */ deserializeU32() { return new DataView(this.read(4)).getUint32(0, true); } /** * Deserializes a uint64 number. * * BCS layout for "uint64": Eight bytes. Binary format in little-endian representation. * @example * ```ts * const deserializer = new Deserializer(new Uint8Array([0x00, 0xEF, 0xCD, 0xAB, 0x78, 0x56, 0x34, 0x12])); * assert(deserializer.deserializeU64() === 1311768467750121216); * ``` */ deserializeU64() { const low = this.deserializeU32(); const high = this.deserializeU32(); return BigInt(BigInt(high) << BigInt(32) | BigInt(low)); } /** * Deserializes a uint128 number. * * BCS layout for "uint128": Sixteen bytes. Binary format in little-endian representation. */ deserializeU128() { const low = this.deserializeU64(); const high = this.deserializeU64(); return BigInt(high << BigInt(64) | low); } /** * Deserializes a uint256 number. * * BCS layout for "uint256": Thirty-two bytes. Binary format in little-endian representation. */ deserializeU256() { const low = this.deserializeU128(); const high = this.deserializeU128(); return BigInt(high << BigInt(128) | low); } /** * Deserializes a uleb128 encoded uint32 number. * * BCS use uleb128 encoding in two cases: (1) lengths of variable-length sequences and (2) tags of enum values */ 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 import { sha3_256 as sha3Hash } from "@noble/hashes/sha3"; // src/aptos_types/account_address.ts var _AccountAddress = class _AccountAddress { constructor(address) { if (address.length !== _AccountAddress.LENGTH) { throw new Error("Expected address of length 32"); } this.address = address; } /** * Creates AccountAddress from a hex string. * @param addr Hex string can be with a prefix or without a prefix, * e.g. '0x1aa' or '1aa'. Hex string will be left padded with 0s if too short. */ 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); } /** * Checks if the string is a valid AccountAddress * @param addr Hex string can be with a prefix or without a prefix, * e.g. '0x1aa' or '1aa'. Hex string will be left padded with 0s if too short. */ 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; } /** * Return a hex string from account Address. */ toHexString() { return HexString.fromUint8Array(this.address).hex(); } serialize(serializer) { serializer.serializeFixedBytes(this.address); } static deserialize(deserializer) { return new _AccountAddress(deserializer.deserializeFixedBytes(_AccountAddress.LENGTH)); } /** * Standardizes an address to the format "0x" followed by 64 lowercase hexadecimal digits. */ 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}`; } }; _AccountAddress.LENGTH = 32; _AccountAddress.CORE_CODE_ADDRESS = _AccountAddress.fromHex("0x1"); var AccountAddress = _AccountAddress; // src/aptos_types/ed25519.ts var _Ed25519PublicKey = class _Ed25519PublicKey { 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); } }; _Ed25519PublicKey.LENGTH = 32; var Ed25519PublicKey = _Ed25519PublicKey; var _Ed25519Signature = class _Ed25519Signature { 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); } }; _Ed25519Signature.LENGTH = 64; var Ed25519Signature = _Ed25519Signature; // src/aptos_types/multi_ed25519.ts var MAX_SIGNATURES_SUPPORTED = 32; var MultiEd25519PublicKey = class _MultiEd25519PublicKey { /** * Public key for a K-of-N multisig transaction. A K-of-N multisig transaction means that for such a * transaction to be executed, at least K out of the N authorized signers have signed the transaction * and passed the check conducted by the chain. * * @see {@link * https://aptos.dev/guides/creating-a-signed-transaction#multisignature-transactions | Creating a Signed Transaction} * * @param public_keys A list of public keys * @param threshold At least "threshold" signatures must be valid */ 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}`); } } /** * Converts a MultiEd25519PublicKey into bytes with: bytes = p1_bytes | ... | pn_bytes | threshold */ 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 _MultiEd25519Signature { /** * Signature for a K-of-N multisig transaction. * * @see {@link * https://aptos.dev/guides/creating-a-signed-transaction#multisignature-transactions | Creating a Signed Transaction} * * @param signatures A list of ed25519 signatures * @param bitmap 4 bytes, at most 32 signatures are supported. If Nth bit value is `1`, the Nth * signature should be provided in `signatures`. Bits are read from left to right */ 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}`); } } /** * Converts a MultiEd25519Signature into bytes with `bytes = s1_bytes | ... | sn_bytes | bitmap` */ 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; } /** * Helper method to create a bitmap out of the specified bit positions * @param bits The bitmap positions that should be set. A position starts at index 0. * Valid position should range between 0 and 31. * @example * Here's an example of valid `bits` * ``` * [0, 2, 31] * ``` * `[0, 2, 31]` means the 1st, 3rd and 32nd bits should be set in the bitmap. * The result bitmap should be 0b1010000000000000000000000000001 * * @returns bitmap that is 32bit long */ 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); } }; _MultiEd25519Signature.BITMAP_LEN = 4; var MultiEd25519Signature = _MultiEd25519Signature; // 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 _TransactionAuthenticatorEd25519 extends TransactionAuthenticator { /** * An authenticator for single signature. * * @param public_key Client's public key. * @param signature Signature of a raw transaction. * @see {@link https://aptos.dev/guides/creating-a-signed-transaction/ | Creating a Signed Transaction} * for details about generating a signature. */ 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 _TransactionAuthenticatorMultiEd25519 extends TransactionAuthenticator { /** * An authenticator for multiple signatures. * * @param public_key * @param signature * */ 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 _TransactionAuthenticatorMultiAgent 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 _TransactionAuthenticatorFeePayer 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 _AccountAuthenticatorEd25519 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 _AccountAuthenticatorMultiEd25519 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 _Identifier { 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 _TypeTagBool extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(0); } static load(_deserializer) { return new _TypeTagBool(); } }; var TypeTagU8 = class _TypeTagU8 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(1); } static load(_deserializer) { return new _TypeTagU8(); } }; var TypeTagU16 = class _TypeTagU16 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(8); } static load(_deserializer) { return new _TypeTagU16(); } }; var TypeTagU32 = class _TypeTagU32 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(9); } static load(_deserializer) { return new _TypeTagU32(); } }; var TypeTagU64 = class _TypeTagU64 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(2); } static load(_deserializer) { return new _TypeTagU64(); } }; var TypeTagU128 = class _TypeTagU128 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(3); } static load(_deserializer) { return new _TypeTagU128(); } }; var TypeTagU256 = class _TypeTagU256 extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(10); } static load(_deserializer) { return new _TypeTagU256(); } }; var TypeTagAddress = class _TypeTagAddress extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(4); } static load(_deserializer) { return new _TypeTagAddress(); } }; var TypeTagSigner = class _TypeTagSigner extends TypeTag { serialize(serializer) { serializer.serializeU32AsUleb128(5); } static load(_deserializer) { return new _TypeTagSigner(); } }; var TypeTagVector = class _TypeTagVector 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 _TypeTagStruct 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 _StructTag { constructor(address, module_name, name, type_args) { this.address = address; this.module_name = module_name; this.name = name; this.type_args = type_args; } /** * Converts a string literal to a StructTag * @param structTag String literal in format "AcountAddress::module_name::ResourceName", * e.g. "0x1::aptos_coin::AptosCoin" * @returns */ 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