ethstorage-sdk
Version:
eip-4844 blobs upload sdk
528 lines (518 loc) • 91.3 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, from2, except, desc) => {
if (from2 && typeof from2 === "object" || typeof from2 === "function") {
for (let key of __getOwnPropNames(from2))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
BLOB_COUNT_LIMIT: () => BLOB_COUNT_LIMIT,
BLOB_SIZE: () => BLOB_SIZE,
DUMMY_VERSIONED_COMMITMENT_HASH: () => DUMMY_VERSIONED_COMMITMENT_HASH,
DecodeType: () => DecodeType,
ETHSTORAGE_MAPPING: () => ETHSTORAGE_MAPPING,
EthStorage: () => EthStorage,
EthStorageAbi: () => EthStorageAbi,
FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0: () => FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0,
FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0: () => FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0,
FlatDirectory: () => FlatDirectory,
FlatDirectoryAbi: () => FlatDirectoryAbi,
FlatDirectoryBytecode: () => FlatDirectoryBytecode,
MAX_BLOB_COUNT: () => MAX_BLOB_COUNT,
MAX_CHUNKS: () => MAX_CHUNKS,
OP_BLOB_DATA_SIZE: () => OP_BLOB_DATA_SIZE,
UploadType: () => UploadType,
utils: () => utils_exports
});
module.exports = __toCommonJS(index_exports);
// src/utils/index.ts
var utils_exports = {};
__export(utils_exports, {
BlobUploader: () => BlobUploader,
EMPTY_BLOB_CONSTANTS: () => EMPTY_BLOB_CONSTANTS,
calcTxCost: () => calcTxCost,
computeVersionedCommitmentHash: () => computeVersionedCommitmentHash,
convertToEthStorageHash: () => convertToEthStorageHash,
convertToEthStorageHashes: () => convertToEthStorageHashes,
copy: () => copy,
encodeOpBlob: () => encodeOpBlob,
encodeOpBlobs: () => encodeOpBlobs,
getChainId: () => getChainId,
getChunkCounts: () => getChunkCounts,
getChunkHashes: () => getChunkHashes,
getContentChunk: () => getContentChunk,
getUploadInfo: () => getUploadInfo,
isBuffer: () => isBuffer,
isFile: () => isFile,
isNodejs: () => isNodejs,
stableRetry: () => stableRetry,
stringToHex: () => stringToHex
});
// src/utils/util.ts
var import_ethers = require("ethers");
var stringToHex = (s) => import_ethers.ethers.hexlify(import_ethers.ethers.toUtf8Bytes(s));
async function getChainId(rpc) {
const provider = new import_ethers.ethers.JsonRpcProvider(rpc);
const network = await provider.getNetwork();
return Number(network.chainId);
}
async function getContentChunk(content, start, end) {
if (isBuffer(content)) {
return content.slice(start, Math.min(end, content.length));
} else {
const slice = content.slice(start, Math.min(end, content.size));
const data = await slice.arrayBuffer();
return new Uint8Array(data);
}
}
function isBuffer(content) {
return content instanceof Uint8Array;
}
function isFile(content) {
if (isNodejs()) {
return content && typeof content === "object" && typeof content.isNodeJs === "boolean" && content.isNodeJs;
} else {
return content instanceof File;
}
}
function isNodejs() {
return typeof process !== "undefined" && !!process.versions && !!process.versions.node;
}
function computeVersionedCommitmentHash(commitment) {
const computedVersionedHash = new Uint8Array(32);
computedVersionedHash.set([1], 0);
const hash = import_ethers.ethers.getBytes(import_ethers.ethers.sha256(commitment));
computedVersionedHash.set(hash.subarray(1), 1);
return computedVersionedHash;
}
function convertToEthStorageHash(commitment) {
const localHash = computeVersionedCommitmentHash(commitment);
const hash = new Uint8Array(32);
hash.set(localHash.subarray(0, 32 - 8));
return import_ethers.ethers.hexlify(hash);
}
function convertToEthStorageHashes(commitments) {
return commitments.map((commitment) => convertToEthStorageHash(commitment));
}
function copy(des, desOff, src, srcOff) {
const srcLength = src.length - srcOff;
const desLength = des.length - desOff;
const length = Math.min(srcLength, desLength);
des.set(src.subarray(srcOff, srcOff + length), desOff);
return length;
}
function calcTxCost(receipt) {
if (!receipt) {
return { normalGasCost: 0n, blobGasCost: 0n };
}
const normalGasCost = receipt.gasUsed * receipt.gasPrice;
const blobGasCost = receipt.blobGasUsed && receipt.blobGasPrice ? BigInt(receipt.blobGasUsed) * BigInt(receipt.blobGasPrice) : 0n;
return {
normalGasCost,
blobGasCost
};
}
// src/param/abi.ts
var EthStorageAbi = [
"function putBlobs(bytes32[] memory _keys, uint256[] memory _blobIdxs, uint256[] memory _lengths)",
"function putBlob(bytes32 _key, uint256 _blobIdx, uint256 _length) public payable",
"function get(bytes32 _key, uint8 _decodeType, uint256 _off, uint256 _len) public view returns (bytes memory)",
"function size(bytes32 _key) public view returns (uint256)",
"function upfrontPayment() public view returns (uint256)"
];
var FlatDirectoryAbi = [
"constructor(uint8 slotLimit, uint32 maxChunkSize, address storageAddress) public",
"function version() external view returns (string)",
"function isSupportBlob() view external returns (bool)",
"function setDefault(bytes memory _defaultFile) external",
"function getChunkHash(bytes memory name, uint256 chunkId) public view returns (bytes32)",
"function writeChunkByCalldata(bytes memory name, uint256 chunkId, bytes calldata data) external payable",
"function writeChunksByBlobs(bytes memory name, uint256[] memory chunkIds, uint256[] memory sizes) external payable",
"function remove(bytes memory name) external returns (uint256)",
"function truncate(bytes memory name, uint256 chunkId) external returns (uint256)",
"function readChunk(bytes memory name, uint256 chunkId) external view returns (bytes memory, bool)",
"function readChunksPaged(bytes memory name, uint256 startChunkId, uint256 limit) external view returns (bytes[] memory chunks)",
"function countChunks(bytes memory name) external view returns (uint256)",
"function getUploadInfo(bytes memory name) external view returns (uint8 mode, uint256 chunkCount, uint256 storageCost)",
"function getChunkHashesBatch((bytes,uint256[])[] memory fileChunks) external view returns (bytes32[] memory)",
"function getChunkCountsBatch(bytes[] memory names) external view returns (uint256[] memory)"
];
// src/param/constant.ts
var MAINNET_CHAIN_ID = 1;
var SEPOLIA_CHAIN_ID = 11155111;
var QUARKCHAIN_L2_TESTNET_CHAIN_ID = 3335;
var ETHSTORAGE_MAPPING = {
[MAINNET_CHAIN_ID]: "0xf0193d6E8fc186e77b6E63af4151db07524f6a7A",
[SEPOLIA_CHAIN_ID]: "0xAb3d380A268d088BA21Eb313c1C23F3BEC5cfe93",
[QUARKCHAIN_L2_TESTNET_CHAIN_ID]: "0x64003adbdf3014f7E38FC6BE752EB047b95da89A"
};
var BlobTxBytesPerFieldElement = 32;
var BlobTxFieldElementsPerBlob = 4096;
var BLOB_SIZE = BlobTxBytesPerFieldElement * BlobTxFieldElementsPerBlob;
var OP_BLOB_DATA_SIZE = (4 * 31 + 3) * 1024 - 4;
var DecodeType = /* @__PURE__ */ ((DecodeType2) => {
DecodeType2[DecodeType2["RawData"] = 0] = "RawData";
DecodeType2[DecodeType2["PaddingPer31Bytes"] = 1] = "PaddingPer31Bytes";
DecodeType2[DecodeType2["OptimismCompact"] = 2] = "OptimismCompact";
return DecodeType2;
})(DecodeType || {});
var BLOB_COUNT_LIMIT = 6;
var MAX_BLOB_COUNT = 6;
var UploadType = /* @__PURE__ */ ((UploadType2) => {
UploadType2[UploadType2["Undefined"] = 0] = "Undefined";
UploadType2[UploadType2["Calldata"] = 1] = "Calldata";
UploadType2[UploadType2["Blob"] = 2] = "Blob";
return UploadType2;
})(UploadType || {});
var MAX_CHUNKS = 120;
var DUMMY_VERSIONED_COMMITMENT_HASH = "0x01f32ebe6ad26adca597cdb198f041f5d96fc197e3de72e299e86fbf1f5817c8";
// src/param/bytecode.ts
var FlatDirectoryBytecode = "0x60c06040525f60a0908152600a90620000199082620001cb565b5034801562000026575f80fd5b5060405162003bb238038062003bb2833981016040819052620000499162000293565b60ff8316608052828282818133806200007b57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200008681620000da565b506004805463ffffffff909316600160a01b0263ffffffff60a01b1990931692909217909155600580546001600160a01b039092166001600160a01b031990921691909117905550620002f9945050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200015457607f821691505b6020821081036200017357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001c6575f81815260208120601f850160051c81016020861015620001a15750805b601f850160051c820191505b81811015620001c257828155600101620001ad565b5050505b505050565b81516001600160401b03811115620001e757620001e76200012b565b620001ff81620001f884546200013f565b8462000179565b602080601f83116001811462000235575f84156200021d5750858301515b5f19600386901b1c1916600185901b178555620001c2565b5f85815260208120601f198616915b82811015620002655788860151825594840194600190910190840162000244565b50858210156200028357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f805f60608486031215620002a6575f80fd5b835160ff81168114620002b7575f80fd5b602085015190935063ffffffff81168114620002d1575f80fd5b60408501519092506001600160a01b0381168114620002ee575f80fd5b809150509250925092565b608051613899620003195f395f818161057801526124ae01526138995ff3fe60806040526004361062000211575f3560e01c8063761ab10e116200011a578063cf86bf9311620000a2578063f14c7ad7116200006c578063f14c7ad71462000850578063f2fde38b1462000867578063f53264ea146200088b578063f916c5b014620008af5762000211565b8063cf86bf9314620007b0578063d84eb56c14620007eb578063dc38b0a2146200080f578063dd473fae14620008335762000211565b8063956a343311620000e4578063956a343314620006fb578063a741f1cb146200071f578063c708dd141462000752578063caf1283614620007765762000211565b8063761ab10e146200063c5780638bf4515c146200066f5780638da5cb5b146200069357806393b7628f14620006b25762000211565b80631ccbc6da116200019e57806354fd4d50116200016857806354fd4d5014620005ae57806358edef4c14620005dd5780635ba1d9e51462000601578063715018a614620006255762000211565b80631ccbc6da146200050857806342216bed146200052e5780634db654f914620005525780634eed7cf114620005695762000211565b8063152a4bb311620001e0578063152a4bb314620004415780631a7237e014620004765780631c5ee10c14620004aa5780631c993ad514620004e45762000211565b8063038cd79f146200038e5780630936286114620003b45780631089f40f14620003e357806311ce02671462000407575b3480156200021d575f80fd5b505f366060808284036200024157505060408051602081019091525f815262000383565b83835f81811062000256576200025662002bca565b9050013560f81c60f81b6001600160f81b031916602f60f81b14620002a257505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b602082015262000383565b8383620002b160018262002bf2565b818110620002c357620002c362002bca565b909101356001600160f81b031916602f60f81b03905062000325576200031c620002f1846001818862002c08565b600a604051602001620003079392919062002c65565b604051602081830303815290604052620008d3565b50905062000376565b6200037262000338846001818862002c08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250620008d392505050565b5090505b620003818162000997565b505b915050805190602001f35b3480156200039a575f80fd5b50620003b2620003ac36600462002e1f565b620009ca565b005b348015620003c0575f80fd5b50620003cb620009e7565b604051620003da919062002eda565b60405180910390f35b348015620003ef575f80fd5b50620003b26200040136600462002ef5565b62000a7b565b34801562000413575f80fd5b5060055462000428906001600160a01b031681565b6040516001600160a01b039091168152602001620003da565b3480156200044d575f80fd5b50620004656200045f36600462002f1a565b62000aab565b604051620003da9392919062002f80565b34801562000482575f80fd5b506200049a6200049436600462002fa3565b62000b5e565b604051620003da92919062002fe8565b348015620004b6575f80fd5b50620004ce620004c836600462002f1a565b62000c09565b60408051928352602083019190915201620003da565b348015620004f0575f80fd5b50620003b26200050236600462002f1a565b62000cad565b34801562000514575f80fd5b506200051f62000cc9565b604051908152602001620003da565b3480156200053a575f80fd5b506200051f6200054c36600462002fa3565b62000d3c565b620003b2620005633660046200309c565b62000dd5565b34801562000575575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003da565b348015620005ba575f80fd5b506040805180820190915260058152640312e312e360dc1b6020820152620003cb565b348015620005e9575f80fd5b506200051f620005fb36600462002f1a565b62000f39565b3480156200060d575f80fd5b506200059d6200061f36600462002fa3565b62000fcc565b34801562000631575f80fd5b50620003b26200104f565b34801562000648575f80fd5b50620006606200065a36600462003127565b62001066565b604051620003da919062003174565b3480156200067b575f80fd5b506200049a6200068d36600462002f1a565b620008d3565b3480156200069f575f80fd5b506004546001600160a01b031662000428565b348015620006be575f80fd5b50620006ec620006d036600462002f1a565b80516020918201205f9081526009909152604090205460ff1690565b604051620003da9190620031d8565b34801562000707575f80fd5b506200051f62000719366004620031ed565b62001215565b3480156200072b575f80fd5b50620007436200073d3660046200320e565b620012b5565b604051620003da9190620032c4565b3480156200075e575f80fd5b50620007436200077036600462003309565b62001370565b34801562000782575f80fd5b506200079a6200079436600462002fa3565b62001514565b60408051928352901515602083015201620003da565b348015620007bc575f80fd5b50600454620007d590600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003da565b348015620007f7575f80fd5b506200051f6200080936600462002fa3565b62001591565b3480156200081b575f80fd5b50620003b26200082d36600462003411565b6200160a565b3480156200083f575f80fd5b50651b585b9d585b60d21b6200051f565b3480156200085c575f80fd5b506200059d62001636565b34801562000873575f80fd5b50620003b26200088536600462003411565b62001660565b34801562000897575f80fd5b50620003b2620008a936600462003439565b620016a3565b348015620008bb575f80fd5b506200051f620008cd36600462002f1a565b62001794565b60605f805f620008fe8580516020918201205f8181526009909252604090912054909160ff90911690565b909250905060028160028111156200091a576200091a62002f4f565b0362000936576200092b8262001812565b935093505050915091565b60018160028111156200094d576200094d62002f4f565b036200095e576200092b82620019e9565b5f5b6040519080825280601f01601f1916602001820160405280156200098b576020820181803683370190505b50955f95509350505050565b5f81516040620009a89190620034aa565b9050601f19620009ba82601f620034aa565b1690506020808303528060208303f35b620009d462001b26565b620009e2835f8484620016a3565b505050565b600a8054620009f69062002c31565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062002c31565b801562000a735780601f1062000a495761010080835404028352916020019162000a73565b820191905f5260205f20905b81548152906001019060200180831162000a5557829003601f168201915b505050505081565b62000a8562001b26565b6004805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80516020808301919091205f8181526009909252604082205460ff16919081906002848181111562000ae15762000ae162002f4f565b0362000afe575f818152600760205260409020545b925062000b33565b600184600281111562000b155762000b1562002f4f565b0362000b2f575f8181526002602052604090205462000af6565b5f92505b6005546001600160a01b031662000b4b575f62000b55565b62000b5562000cc9565b93959294505050565b60605f805f62000b898680516020918201205f8181526009909252604090912054909160ff90911690565b9092509050600281600281111562000ba55762000ba562002f4f565b0362000bc35762000bb7828662001b55565b93509350505062000c02565b600181600281111562000bda5762000bda62002f4f565b0362000bec5762000bb7828662001c2c565b5050604080515f80825260208201909252925090505b9250929050565b80516020808301919091205f8181526009909252604082205482919060ff166002818181111562000c3e5762000c3e62002f4f565b0362000c64575f828152600860209081526040808320546007909252909120546200092b565b600181600281111562000c7b5762000c7b62002f4f565b0362000ca1575f828152600360209081526040808320546002909252909120546200092b565b505f9485945092505050565b62000cb762001b26565b600a62000cc5828262003509565b5050565b60055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000d11573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000d379190620035d1565b905090565b81516020808401919091205f8181526009909252604082205460ff166002818181111562000d6e5762000d6e62002f4f565b0362000d8a5762000d80828562001215565b9250505062000dcf565b600181600281111562000da15762000da162002f4f565b0362000dc9575f62000db4838662001c2c565b508051602090910120935062000dcf92505050565b505f9150505b92915050565b62000ddf62001b26565b62000de962001636565b62000e545760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084015b60405180910390fd5b82516020808501919091205f81815260099092526040822054909160ff9091169081600281111562000e8a5762000e8a62002f4f565b148062000eab5750600281600281111562000ea95762000ea962002f4f565b145b62000ef05760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e4b565b5f81600281111562000f065762000f0662002f4f565b0362000f25575f828152600960205260409020805460ff191660021790555b62000f3282858562001c9f565b5050505050565b5f62000f4462001b26565b81516020808401919091205f81815260099092526040909120805460ff19811690915560ff166002818181111562000f805762000f8062002f4f565b0362000f9a5762000f92825f62001fbc565b949350505050565b600181600281111562000fb15762000fb162002f4f565b0362000fc35762000f92825f620020e9565b505f9392505050565b5f62000fd762001b26565b82516020808501919091205f818152600990925260409091205460ff16600281818111156200100a576200100a62002f4f565b036200101c5762000d8082856200218a565b600181600281111562001033576200103362002f4f565b03620010455762000d808285620022ac565b505f949350505050565b6200105962001b26565b620010645f6200233d565b565b60605f620010748562001794565b90505f620010838486620034aa565b905081811115620010915750805b5f858211620010a1575f620010ad565b620010ad868362002bf2565b90505f80620010d78980516020918201205f8181526009909252604090912054909160ff90911690565b91509150826001600160401b03811115620010f657620010f662002cec565b6040519080825280602002602001820160405280156200112b57816020015b6060815260200190600190039081620011155790505b5095505f5b8381101562001208575f62001146828b620034aa565b905060028360028111156200115f576200115f62002f4f565b03620011985762001171848262001b55565b5088838151811062001187576200118762002bca565b6020026020010181905250620011f2565b6001836002811115620011af57620011af62002f4f565b03620011c15762001171848262001c2c565b604080515f8152602081019091528851899084908110620011e657620011e662002bca565b60200260200101819052505b5080620011ff81620035e9565b91505062001130565b5050505050509392505050565b6005545f83815260066020908152604080832085845290915280822054905163d8389dc560e01b815291926001600160a01b03169163d8389dc591620012619160040190815260200190565b602060405180830381865afa1580156200127d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012a3919062003604565b67ffffffffffffffff19169392505050565b60605f82516001600160401b03811115620012d457620012d462002cec565b604051908082528060200260200182016040528015620012fe578160200160208202803683370190505b5090505f5b835181101562001369576200133484828151811062001326576200132662002bca565b602002602001015162001794565b82828151811062001349576200134962002bca565b6020908102919091010152806200136081620035e9565b91505062001303565b5092915050565b60605f805b8351811015620013c55783818151811062001394576200139462002bca565b6020026020010151602001515182620013ae9190620034aa565b915080620013bc81620035e9565b91505062001375565b505f816001600160401b03811115620013e257620013e262002cec565b6040519080825280602002602001820160405280156200140c578160200160208202803683370190505b5090505f805b85518110156200150a575f5b86828151811062001433576200143362002bca565b60200260200101516020015151811015620014f457620014af87838151811062001461576200146162002bca565b60200260200101515f015188848151811062001481576200148162002bca565b6020026020010151602001518381518110620014a157620014a162002bca565b602002602001015162000d3c565b848481518110620014c457620014c462002bca565b602090810291909101015282620014db81620035e9565b9350508080620014eb90620035e9565b9150506200141e565b50806200150181620035e9565b91505062001412565b5090949350505050565b81516020808401919091205f8181526009909252604082205482919060ff166002818181111562001549576200154962002f4f565b036200155b5762000bb782866200238e565b600181600281111562001572576200157262002f4f565b03620015845762000bb782866200244a565b505f958695509350505050565b5f6200159c62001b26565b82516020808501919091205f818152600990925260409091205460ff1660028181811115620015cf57620015cf62002f4f565b03620015e15762000d80828562001fbc565b6001816002811115620015f857620015f862002f4f565b03620010455762000d808285620020e9565b6200161462001b26565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005545f906001600160a01b03161580159062000d3757505f6200165962000cc9565b1015905090565b6200166a62001b26565b6001600160a01b0381166200169557604051631e4fbdf760e01b81525f600482015260240162000e4b565b620016a0816200233d565b50565b620016ad62001b26565b83516020808601919091205f81815260099092526040822054909160ff90911690816002811115620016e357620016e362002f4f565b1480620017045750600181600281111562001702576200170262002f4f565b145b620017495760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e4b565b5f8160028111156200175f576200175f62002f4f565b036200177e575f828152600960205260409020805460ff191660011790555b6200178c828686866200249d565b505050505050565b80516020808301919091205f8181526009909252604082205460ff1660028181811115620017c657620017c662002f4f565b03620017e157505f9081526007602052604090205492915050565b6001816002811115620017f857620017f862002f4f565b0362000fc3575f8281526002602052604090205462000f92565b60605f805f6200183a855f908152600860209081526040808320546007909252909120549091565b91509150805f036200184d575f62000960565b5f826001600160401b0381111562001869576200186962002cec565b6040519080825280601f01601f19166020018201604052801562001894576020820181803683370190505b5090505f805b83811015620019da575f88815260066020908152604080832084845290915280822054600554915163afd5644d60e01b8152600481018290529092916001600160a01b03169063afd5644d90602401602060405180830381865afa15801562001905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200192b9190620035d1565b60055460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620019659085906002905f9087906004016200362e565b5f60405180830381865afa15801562001980573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620019a991908101906200365b565b508060406020868801013e620019c08185620034aa565b935050508080620019d190620035e9565b9150506200189a565b50909660019650945050505050565b60605f805f62001a11855f908152600360209081526040808320546002909252909120549091565b91509150805f0362001a24575f62000960565b5f826001600160401b0381111562001a405762001a4062002cec565b6040519080825280601f01601f19166020018201604052801562001a6b576020820181803683370190505b509050602081015f5b83811015620019da575f888152602081815260408083208484529091528120549062001aa08262002582565b1562001ae15762001ab18260e01c90565b5f8b8152600160209081526040808320878452909152902090915062001ad990838662002596565b505062001b00565b8162001aed8162002646565b50915062001afc81866200266b565b5050505b62001b0c8185620034aa565b93505050808062001b1d90620035e9565b91505062001a74565b6004546001600160a01b03163314620010645760405163118cdaa760e01b815233600482015260240162000e4b565b60605f8062001b6585856200238e565b509050600181101562001b8b575050604080515f80825260208201909252915062000c02565b6005545f86815260066020908152604080832088845290915280822054905163bea94b8b60e01b815291926001600160a01b03169163bea94b8b9162001bdb91600290869088906004016200362e565b5f60405180830381865afa15801562001bf6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001c1f91908101906200365b565b9660019650945050505050565b5f828152602081815260408083208484529091528120546060919062001c528162002582565b1562001c89575f858152600160209081526040808320878452909152902062001c7c9082620026a3565b6001925092505062000c02565b62001c948162002746565b925092505062000c02565b815160055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001ce9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001d0f9190620035d1565b905062001d1d8282620036d5565b34101562001d655760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640162000e4b565b5f5b828110156200178c5783818151811062001d855762001d8562002bca565b60200260200101515f10801562001dd05750600460149054906101000a900463ffffffff1663ffffffff1684828151811062001dc55762001dc562002bca565b602002602001015111155b62001e155760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b604482015260640162000e4b565b62001e5a8686838151811062001e2f5762001e2f62002bca565b602002602001015186848151811062001e4c5762001e4c62002bca565b6020026020010151620027c5565b5f338787848151811062001e725762001e7262002bca565b602002602001015160405160200162001ea9939291906001600160a01b039390931683526020830191909152604082015260600190565b60405160208183030381529060405280519060200120905060055f9054906101000a90046001600160a01b03166001600160a01b0316634581a92084838589878151811062001efc5762001efc62002bca565b60200260200101516040518563ffffffff1660e01b815260040162001f34939291909283526020830191909152604082015260600190565b5f604051808303818588803b15801562001f4c575f80fd5b505af115801562001f5f573d5f803e3d5ffd5b50505050508060065f8981526020019081526020015f205f88858151811062001f8c5762001f8c62002bca565b602002602001015181526020019081526020015f208190555050808062001fb390620035e9565b91505062001d67565b5f5b5f83815260066020908152604080832085845290915290205415620020e3576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620020299160040190815260200190565b602060405180830381865afa15801562002045573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200206b9190620035d1565b90508060085f8681526020019081526020015f205f8282546200208f919062002bf2565b90915550505f848152600660209081526040808320868452825280832083905586835260079091528120805491620020c783620036ef565b91905055508280620020d990620035e9565b9350505062001fbe565b50919050565b5f5b5f8381526020818152604080832085845290915290205415620020e3575f6200211584846200244a565b505f858152602081815260408083208784528252808320839055878352600290915281208054929350906200214a83620036ef565b90915550505f84815260036020526040812080548392906200216e90849062002bf2565b909155508390506200218081620035e9565b93505050620020eb565b5f82815260076020526040812054620021a69060019062002bf2565b8214620021b557505f62000dcf565b6005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620022019160040190815260200190565b602060405180830381865afa1580156200221d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620022439190620035d1565b5f8581526006602090815260408083208784528252808320839055878352600790915281208054929350906200227983620036ef565b90915550505f84815260086020526040812080548392906200229d90849062002bf2565b90915550600195945050505050565b5f82815260026020526040812054620022c89060019062002bf2565b8214620022d757505f62000dcf565b5f620022e484846200244a565b505f858152602081815260408083208784528252808320839055878352600290915281208054929350906200231983620036ef565b90915550505f84815260036020526040812080548392906200229d90849062002bf2565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8281526007602052604081205481908310620023b057505f90508062000c02565b6005545f85815260066020908152604080832087845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620023fc9160040190815260200190565b602060405180830381865afa15801562002418573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200243e9190620035d1565b95600195509350505050565b5f8281526020818152604080832084845290915281205481908062002476575f80925092505062000c02565b620024818162002582565b15620024925762001c7c8160e01c90565b62001c948162002646565b620024aa8484836200293c565b60ff7f0000000000000000000000000000000000000000000000000000000000000000168111156200250f57620024f2620024e6838362002a5e565b6001600160a01b031690565b5f858152602081815260408083208784529091529020556200257c565b5f8481526001602090815260408083208684528252918290208251601f85018390048302810183019093528383526200256492909185908590819084018382808284375f9201919091525062002aa092505050565b5f858152602081815260408083208784529091529020555b50505050565b5f806200258f8360e01c90565b1192915050565b5f805f620025a48562002b38565b808652909350905083601c8411156200263857601c81015f805b60206001620025cf601c8a62002bf2565b620025dc906020620034aa565b620025e8919062002bf2565b620025f4919062003707565b81101562002634575f81815260208b815260409091205480855292506200261d908490620034aa565b9250806200262b81620035e9565b915050620025be565b5050505b600192505050935093915050565b5f806001600160a01b0383166200266157505f928392509050565b50503b9081151590565b5f805f806200267a8662002646565b915091508062002692575f8093509350505062000c02565b815f86883c50946001945092505050565b60605f620026b18362002b52565b92509050601c8111156200136957603c82015f805b60206001620026d7601c8762002bf2565b620026e4906020620034aa565b620026f0919062002bf2565b620026fc919062003707565b8110156200273c575f8181526020888152604090912054808552925062002725908490620034aa565b9250806200273381620035e9565b915050620026c6565b5050505092915050565b60605f805f620027568562002646565b915091508062002767575f62000960565b5f826001600160401b0381111562002783576200278362002cec565b6040519080825280601f01601f191660200182016040528015620027ae576020820181803683370190505b509050825f60208301883c95600195509350505050565b5f838152600760205260409020548211156200281d5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e4b565b5f83815260076020526040902054821015620028f2576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d916200287f9160040190815260200190565b602060405180830381865afa1580156200289b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620028c19190620035d1565b90508060085f8681526020019081526020015f205f828254620028e5919062002bf2565b9091555062002913915050565b5f8381526007602052604081208054916200290d83620035e9565b91905055505b5f838152600860205260408120805483929062002932908490620034aa565b9091555050505050565b5f8381526020818152604080832085845290915290205480620029fb578215806200298e57505f848152602081905260408120816200297d60018762002bf2565b81526020019081526020015f205414155b620029d55760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e4b565b5f848152600260205260408120805491620029f083620035e9565b919050555062002a34565b5f62002a0885856200244a565b5090508060035f8781526020019081526020015f205f82825462002a2d919062002bf2565b9091555050505b5f848152600360205260408120805484929062002a53908490620034aa565b909155505050505050565b5f80838360405162002a709062002bbc565b62002a7d92919062003727565b604051809103905ff08015801562002a97573d5f803e3d5ffd5b50949350505050565b805160208083015160e083901b911c1790601c81111562001369575f603c8401815b6020600162002ad3601c8762002bf2565b62002ae0906020620034aa565b62002aec919062002bf2565b62002af8919062003707565b8110156200273c578151925062002b11826020620034aa565b5f82815260208990526040902084905591508062002b2f81620035e9565b91505062002ac2565b5f8062002b458360e01c90565b9360209390931b92915050565b5f606062002b608360e01c90565b9150602083901b9250816001600160401b0381111562002b845762002b8462002cec565b6040519080825280601f01601f19166020018201604052801562002baf576020820181803683370190505b5060208101939093525091565b61010e806200375683390190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111562000dcf5762000dcf62002bde565b5f808585111562002c17575f80fd5b8386111562002c24575f80fd5b5050820193919092039150565b600181811c9082168062002c4657607f821691505b602082108103620020e357634e487b7160e01b5f52602260045260245ffd5b828482375f8382015f81525f845462002c7e8162002c31565b6001828116801562002c99576001811462002caf5762002cdd565b60ff198416865282151583028601945062002cdd565b885f526020805f205f5b8581101562002cd45781548982015290840190820162002cb9565b50505082860194505b50929998505050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171562002d255762002d2562002cec565b60405290565b604051601f8201601f191681016001600160401b038111828210171562002d565762002d5662002cec565b604052919050565b5f6001600160401b0382111562002d795762002d7962002cec565b50601f01601f191660200190565b5f82601f83011262002d97575f80fd5b813562002dae62002da88262002d5e565b62002d2b565b81815284602083860101111562002dc3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8083601f84011262002df0575f80fd5b5081356001600160401b0381111562002e07575f80fd5b60208301915083602082850101111562000c02575f80fd5b5f805f6040848603121562002e32575f80fd5b83356001600160401b038082111562002e49575f80fd5b62002e578783880162002d87565b9450602086013591508082111562002e6d575f80fd5b5062002e7c8682870162002ddf565b9497909650939450505050565b5f5b8381101562002ea557818101518382015260200162002e8b565b50505f910152565b5f815180845262002ec681602086016020860162002e89565b601f01601f19169290920160200192915050565b602081525f62002eee602083018462002ead565b9392505050565b5f6020828403121562002f06575f80fd5b813563ffffffff8116811462002eee575f80fd5b5f6020828403121562002f2b575f80fd5b81356001600160401b0381111562002f41575f80fd5b62000f928482850162002d87565b634e487b7160e01b5f52602160045260245ffd5b60038110620016a057634e487b7160e01b5f52602160045260245ffd5b6060810162002f8f8562002f63565b938152602081019290925260409091015290565b5f806040838503121562002fb5575f80fd5b82356001600160401b0381111562002fcb575f80fd5b62002fd98582860162002d87565b95602094909401359450505050565b604081525f62002ffc604083018562002ead565b905082151560208301529392505050565b5f6001600160401b0382111562003028576200302862002cec565b5060051b60200190565b5f82601f83011262003042575f80fd5b813560206200305562002da8836200300d565b82815260059290921b8401810191818101908684111562003074575f80fd5b8286015b8481101562003091578035835291830191830162003078565b509695505050505050565b5f805f60608486031215620030af575f80fd5b83356001600160401b0380821115620030c6575f80fd5b620030d48783880162002d87565b94506020860135915080821115620030ea575f80fd5b620030f88783880162003032565b935060408601359150808211156200310e575f80fd5b506200311d8682870162003032565b9150509250925092565b5f805f606084860312156200313a575f80fd5b83356001600160401b0381111562003150575f80fd5b6200315e8682870162002d87565b9660208601359650604090950135949350505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b82811015620031cb57603f19888603018452620031b885835162002ead565b9450928501929085019060010162003199565b5092979650505050505050565b60208101620031e78362002f63565b91905290565b5f8060408385031215620031ff575f80fd5b50508035926020909101359150565b5f602080838503121562003220575f80fd5b82356001600160401b038082111562003237575f80fd5b818501915085601f8301126200324b575f80fd5b81356200325c62002da8826200300d565b81815260059190911b830184019084810190888311156200327b575f80fd5b8585015b83811015620032b75780358581111562003298575f8081fd5b620032a88b89838a010162002d87565b8452509186019186016200327f565b5098975050505050505050565b602080825282518282018190525f9190848201906040850190845b81811015620032fd57835183529284019291840191600101620032df565b50909695505050505050565b5f60208083850312156200331b575f80fd5b82356001600160401b038082111562003332575f80fd5b818501915085601f83011262003346575f80fd5b81356200335762002da8826200300d565b81815260059190911b8301840190848101908883111562003376575f80fd5b8585015b83811015620032b75780358581111562003393575f8081fd5b86016040818c03601f1901811315620033ab575f8081fd5b620033b562002d00565b8983013588811115620033c7575f8081fd5b620033d78e8c8387010162002d87565b825250908201359087821115620033ed575f8081fd5b620033fd8d8b8486010162003032565b818b0152855250509186019186016200337a565b5f6020828403121562003422575f80fd5b81356001600160a01b038116811462002eee575f80fd5b5f805f80606085870312156200344d575f80fd5b84356001600160401b038082111562003464575f80fd5b620034728883890162002d87565b95506020870135945060408701359150808211156200348f575f80fd5b506200349e8782880162002ddf565b95989497509550505050565b8082018082111562000dcf5762000dcf62002bde565b601f821115620009e2575f81815260208120601f850160051c81016020861015620034e85750805b601f850160051c820191505b818110156200178c57828155600101620034f4565b81516001600160401b0381111562003525576200352562002cec565b6200353d8162003536845462002c31565b84620034c0565b602080601f83116001811462003573575f84156200355b5750858301515b5f19600386901b1c1916600185901b1785556200178c565b5f85815260208120601f198616915b82811015620035a35788860151825594840194600190910190840162003582565b5085821015620035c157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620035e2575f80fd5b5051919050565b5f60018201620035fd57620035fd62002bde565b5060010190565b5f6020828403121562003615575f80fd5b815167ffffffffffffffff198116811462002eee575f80fd5b84815260808101620036408562002f63565b84602083015283604083015282606083015295945050505050565b5f602082840312156200366c575f80fd5b81516001600160401b0381111562003682575f80fd5b8201601f8101841362003693575f80fd5b8051620036a462002da88262002d5e565b818152856020838501011115620036b9575f80fd5b620036cc82602083016020860162002e89565b95945050505050565b808202811582820484141762000dcf5762000dcf62002bde565b5f8162003700576200370062002bde565b505f190190565b5f826200372257634e487b7160e01b5f52601260045260245ffd5b500490565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fe608060405234801561000f575f80fd5b5060405161010e38038061010e83398101604081905261002e9161004b565b80518060208301f35b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561005c575f80fd5b82516001600160401b0380821115610072575f80fd5b818501915085601f830112610085575f80fd5b81518181111561009757610097610037565b604051601f8201601f19908116603f011681019083821181831017156100bf576100bf610037565b8160405282815288868487010111156100d6575f80fd5b5f93505b828410156100f757848401860151818501870152928501926100da565b5f8684830101528096505050505050509291505056fea2646970667358221220ebcd139e7374a9f1c5b5d7c1230cab1e82cbda5396f436b329517280494c00bb64736f6c63430008140033";
var FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0 = "1.0.0";
var FLAT_DIRECTORY_CONTRACT_VERSION_1_1_0 = "1.1.0";
// src/utils/blobs.ts
var MaxBlobDataSize = (4 * 31 + 3) * 1024 - 4;
var EncodingVersion = 0;
var Rounds = 1024;
function encodeOpBlobs(data) {
const len = data.length;
if (len === 0) {
throw new Error("invalid blob data");
}
const blobs = [];
for (let i = 0; i < len; i += MaxBlobDataSize) {
let max = i + MaxBlobDataSize;
if (max > len) {
max = len;
}
const blob = encodeOpBlob(data.subarray(i, max));
blobs.push(blob);
}
return blobs;
}
function encodeOpBlob(data) {
if (data.length > MaxBlobDataSize) {
throw new Error(`too much data to encode in one blob, len=${data.length}`);
}
const b = new Uint8Array(BLOB_SIZE).fill(0);
let readOffset = 0;
const read1 = () => {
if (readOffset >= data.length) {
return 0;
}
const out = data[readOffset];
readOffset += 1;
return out;
};
let writeOffset = 0;
const buf31 = new Uint8Array(31);
const zero31 = new Uint8Array(31);
const read31 = () => {
if (readOffset >= data.length) {
copy(buf31, 0, zero31, 0);
return;
}
const n = copy(buf31, 0, data, readOffset);
copy(buf31, n, zero31, 0);
readOffset += n;
};
const write1 = (v) => {
if (writeOffset % 32 !== 0) {
throw new Error(`blob encoding: invalid byte write offset: ${writeOffset}`);
}
const tag = v & 192;
if (tag !== 0) {
throw new Error(`blob encoding: invalid 6 bit value: 0b${v.toString(2)}`);
}
b[writeOffset] = v;
writeOffset += 1;
};
const write31 = () => {
if (writeOffset % 32 !== 1) {
throw new Error(`blob encoding: invalid bytes31 write offset: ${writeOffset}`);
}
copy(b, writeOffset, buf31, 0);
writeOffset += 31;
};
for (let round = 0; round < Rounds && readOffset < data.length; round++) {
if (round === 0) {
buf31[0] = EncodingVersion;
const ilen = data.length;
buf31[1] = ilen >> 16 & 255;
buf31[2] = ilen >> 8 & 255;
buf31[3] = ilen & 255;
readOffset += copy(buf31, 4, data, 0);
} else {
read31();
}
const x = read1();
const A = x & 63;
write1(A);
write31();
read31();
const y = read1();
const B = y & 15 | (x & 192) >> 2;
write1(B);
write31();
read31();
const z = read1();
const C = z & 63;
write1(C);
write31();
read31();
const D = (z & 192) >> 2 | (y & 240) >> 4;
write1(D);
write31();
}
if (readOffset < data.length) {
throw new Error(`expected to fit data but failed, read offset: ${readOffset}, data: ${data}`);
}
return b;
}
// src/utils/uploader.ts
var import_ethers2 = require("ethers");
var import_async_mutex = require("async-mutex");
var import_js_kzg = require("js-kzg");
// src/utils/retry.ts
var FIXED_TOTAL_RETRIES = 5;
var FIXED_BASE_DELAY = 100;
var FIXED_MAX_DELAY = 5e3;
var INTERNAL_FIXED_RETRIES = {
SOCKET: 5,
// Connection/Socket errors (high retry chance)
NETWORK: 3,
// DNS/Reachability errors
TIMEOUT: 3,
// Request timeouts
RATE_LIMIT: 5,
// 429 errors (high retry chance after delay)
SERVER: 2,
// HTTP 5xx errors
RPC_SERVER: 2,
// JSON-RPC internal errors (-32xxx)
CLIENT: 0,
// Client errors (4xx) are never retried
UNKNOWN: 1
// Unclassified errors (minimal safeguard retry)
};
function classifyError(error) {
const code = error.code || error.cause?.code || "";
const message = (error.message || error.cause?.message || "").toLowerCase();
const statusCode = error.statusCode || error.response?.statusCode;
if (["ECONNRESET", "ECONNREFUSED", "EPIPE", "ECONNABORTED"].includes(String(code))) return "SOCKET";
if (["ETIMEDOUT", "ENOTFOUND", "EHOSTUNREACH", "ENETUNREACH"].includes(String(code))) return "NETWORK";
if (message.includes("timeout") || message.includes("timed out")) return "TIMEOUT";
if (statusCode === 429 || code === 429 || message.includes("rate limit")) return "RATE_LIMIT";
if ([-32e3, -32603, -32601, -32600].includes(Number(code))) return "RPC_SERVER";
if (typeof statusCode === "number") {
if (statusCode >= 500) return "SERVER";
if (statusCode >= 400) return "CLIENT";
}
return "UNKNOWN";
}
function isRetryable(error) {
const type = classifyError(error);
if (type === "CLIENT") return false;
const retryableTypes = ["SOCKET", "NETWORK", "TIMEOUT", "RATE_LIMIT", "SERVER", "RPC_SERVER", "UNKNOWN"];
return retryableTypes.includes(type);
}
function computeDelay(attempt) {
const base = FIXED_BASE_DELAY;
const max = FIXED_MAX_DELAY;
if (attempt < 0) return base;
let delay = base * Math.pow(2, attempt);
delay = Math.min(delay, max);
const jitter = delay * 0.2 * (Math.random() * 2 - 1);
return Math.floor(Math.max(delay + jitter, 0));
}
async function stableRetry(fn, ...args) {
const totalRetries = FIXED_TOTAL_RETRIES;
const errorTypeRetries = INTERNAL_FIXED_RETRIES;
const errorTypeCount = {
SOCKET: 0,
NETWORK: 0,
TIMEOUT: 0,
RATE_LIMIT: 0,
SERVER: 0,
RPC_SERVER: 0,
CLIENT: 0,
UNKNOWN: 0
};
let lastError = {};
let totalAttempts = 0;
while (true) {
try {
return await fn(...args);
} catch (err) {
lastError = err;
totalAttempts++;
const type = classifyError(err);
if (!isRetryable(err)) {
const wrapErr = new Error(`Non-retryable error: ${err.message} (type: ${type})`);
wrapErr.cause = err;
throw wrapErr;
}
errorTypeCount[type] += 1;
const typeMax = errorTypeRetries[type] || 0;
if (errorTypeCount[type] > typeMax) {
break;
}
if (totalAttempts > totalRetries) {
break;
}
const delay = computeDelay(errorTypeCount[type] - 1);
await new Promise((r) => setTimeout(r, delay));
}
}
const lastErrorType = classifyError(lastError);
const finalError = new Error(`Retry failed after ${totalAttempts} attempts (last error type: ${lastErrorType}): ${lastError?.message || "Unknown error"}`);
finalError.cause = lastError;
throw finalError;
}
// src/utils/uploader.ts
var BLOB_TX = {
TYPE: 3,
WRAPPER_VERSION: 1,
DEFAULT_GAS_INC_PCT: 0
};
var EMPTY_BLOB_CONSTANTS = {
// 128KB full 0
DATA: new Uint8Array(131072),
COMMITMENT: import_ethers2.ethers.getBytes("0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
};
var KzgHelper = class {
#instance = null;
#initPromise = null;
async getInstance() {
if (this.#instance) return this.#instance;
if (!this.#initPromise) {
this.#initPromise = this.#initialize();
}
return this.#initPromise;
}
async #initialize() {
const kzg = await import_js_kzg.KZG.create();
this.#instance = kzg;
return kzg;
}
async computeCommitments(blobs) {
const kzg = await this.getInstance();
const hex = await kzg.computeCommitmentBatch(blobs);
return hex.map((h) => import_ethers2.ethers.getBytes(h));
}
async computeCellProofs(blobs) {
const kzg = await this.getInstance();
const proofs = await kzg.computeCellsProofsBatch(blobs);
return proofs.map((p) => import_ethers2.ethers.concat(p));
}
async destroy() {
if (this.#instance) {
await this.#instance.terminate();
this.#instance = null;
this.#initPromise = null;
}
}
};
var BlobUploader = class {
#provider;
#wallet;
// Mutex for serializing nonce fetching and transaction submission
#mutex = new import_async_mutex.Mutex();
// KZG Helper for lazy initialization and computation
#kzg = new KzgHelper();
constructor(rpc, privateKey) {
this.#provider = new import_ethers2.ethers.JsonRpcProvider(rpc);
this.#wallet = new import_ethers2.ethers.Wallet(privateKey, this.#provider);
}
// ====================== Gas API ======================
async getBlobGasPrice() {
const base = await stableRetry(() => this.#provider.send("eth_blobBaseFee", []));
if (!base) throw new Error("RPC returned empty response");
return BigInt(base) * 20n / 10n;
}
async getGasPrice() {
return await stableRetry(() => this.#provider.getFeeData());
}
// ====================== Blob Utility API ======================
async computeCommitmentsForBlobs(blobs) {
return await this.#kzg.computeCommitments(blobs);
}
async computeEthStorageHashesForBlobs(blobs) {
const com = await this.#kzg.computeCommitments(blobs);
return convertToEthStorageHashes(com);
}
async getTransactionResult(hash) {
if (!hash || !import_ethers2.ethers.isHexString(hash)) throw new Error("Invalid transaction hash");
const receipt = await stableRetry(() => this.#provider.waitForTransaction(hash));
return { txCost: calcTxCost(receipt), success: receipt?.status === 1 };
}
/**
* Computes KZG commitments and cell proofs for the given blobs,
* then constructs an EIP-4844 transaction request with the corresponding fields.
*/
async buildBlobTx(params) {
const { baseTx, blobs, commitments, gasIncPct = BLOB_TX.DEFAULT_GAS_INC_PCT } = params;
if (gasIncPct < 0) {
throw new Error("Gas increase percentage cannot be negative");
}
const fullCommitments = commitments?.length === blobs.length ? commitments : await this.#kzg.computeCommitments(blobs);
const cellProofs = await this.#kzg.computeCellProofs(blobs);
const ethersBlobs = blobs.map((blob, i) => ({
data: blob,
commitment: fullCommitments[i],
proof: cellProofs[i]
}));
const versionedHashes = fullCommitments.map(
(c) => import_ethers2.ethers.hexlify(computeVersionedCommitmentHash(c))
);
const tx = {
...baseTx,
type: BLOB_TX.TYPE,
blobWrapperVersion: BLOB_TX.WRAPPER_VERSION,
blobVersionedHashes: versionedHashes,
blobs: ethersBlobs,
maxFeePerBlobGas: baseTx.maxFeePerBlobGas ?? await this.getBlobGasPrice()
};
if (gasIncPct > 0) {
const feeData = await this.getGasPrice();
tx.maxFeePerGas = feeData.maxFeePerGas * BigInt(100 + gasIncPct) / BigInt(100);
tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas * BigInt(100 + gasIncPct) / BigInt(100);
tx.maxFeePerBlobGas = BigInt(tx.maxFeePerBlobGas) * BigInt(100 + gasIncPct) / BigInt(100);
}
return tx;
}
// ====================== Public Send API ======================
/**
* Sends a transaction without using the Mutex lock.
*/
async sendTx(tx) {
return this.#send({ tx, confirmNonce: false });
}
/**
* Sends a transaction using the Mutex lock to ensure sequential submission.
*/
async sendTxLock(tx, confirmNonce) {
return this.#send({ tx, confirmNonce, useLock: tru