ethstorage-sdk
Version:
eip-4844 blobs upload sdk
556 lines (546 loc) • 74.4 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __typeError = (msg) => {
throw TypeError(msg);
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
// 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,
FlatDirectory: () => FlatDirectory,
FlatDirectoryAbi: () => FlatDirectoryAbi,
FlatDirectoryBytecode: () => FlatDirectoryBytecode,
MAX_BLOB_COUNT: () => MAX_BLOB_COUNT,
MAX_CHUNKS: () => MAX_CHUNKS,
MAX_RETRIES: () => MAX_RETRIES,
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,
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,
retry: () => retry,
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));
}
async function retry(fn, retries, ...args) {
for (let i = 0; i < retries; i++) {
try {
return await fn(...args);
} catch (error) {
if (i === retries - 1) {
throw error;
}
}
}
throw new Error("Function failed after maximum retries");
}
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;
}
// 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 writeChunk(bytes memory name, uint256 chunkId, bytes calldata data) external payable",
"function writeChunks(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 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 SEPOLIA_CHAIN_ID = 11155111;
var QUARKCHAIN_L2_DEVNET_CHAIN_ID = 42069;
var QUARKCHAIN_L2_TESTNET_CHAIN_ID = 3335;
var ETHSTORAGE_MAPPING = {
[SEPOLIA_CHAIN_ID]: "0x804C520d3c084C805E37A35E90057Ac32831F96f",
[QUARKCHAIN_L2_DEVNET_CHAIN_ID]: "0x90a708C0dca081ca48a9851a8A326775155f87Fd",
[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 = 3;
var UploadType = /* @__PURE__ */ ((UploadType2) => {
UploadType2[UploadType2["Undefined"] = 0] = "Undefined";
UploadType2[UploadType2["Calldata"] = 1] = "Calldata";
UploadType2[UploadType2["Blob"] = 2] = "Blob";
return UploadType2;
})(UploadType || {});
var MAX_RETRIES = 3;
var MAX_CHUNKS = 120;
var DUMMY_VERSIONED_COMMITMENT_HASH = "0x01f32ebe6ad26adca597cdb198f041f5d96fc197e3de72e299e86fbf1f5817c8";
// src/param/bytecode.ts
var FlatDirectoryBytecode = "0x60c06040525f60a0908152600a90620000199082620001cb565b5034801562000026575f80fd5b506040516200399a3803806200399a833981016040819052620000499162000293565b60ff8316608052828282818133806200007b57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200008681620000da565b506004805463ffffffff909316600160a01b0263ffffffff60a01b1990931692909217909155600580546001600160a01b039092166001600160a01b031990921691909117905550620002f9945050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200015457607f821691505b6020821081036200017357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001c6575f81815260208120601f850160051c81016020861015620001a15750805b601f850160051c820191505b81811015620001c257828155600101620001ad565b5050505b505050565b81516001600160401b03811115620001e757620001e76200012b565b620001ff81620001f884546200013f565b8462000179565b602080601f83116001811462000235575f84156200021d5750858301515b5f19600386901b1c1916600185901b178555620001c2565b5f85815260208120601f198616915b82811015620002655788860151825594840194600190910190840162000244565b50858210156200028357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f805f60608486031215620002a6575f80fd5b835160ff81168114620002b7575f80fd5b602085015190935063ffffffff81168114620002d1575f80fd5b60408501519092506001600160a01b0381168114620002ee575f80fd5b809150509250925092565b608051613681620003195f395f81816105bf015261234801526136815ff3fe6080604052600436106200021d575f3560e01c80635ba1d9e51162000126578063caf1283611620000ae578063dd473fae1162000078578063dd473fae1462000847578063f14c7ad71462000864578063f2fde38b146200087b578063f53264ea146200089f578063f916c5b014620008c3576200021d565b8063caf12836146200078a578063cf86bf9314620007c4578063d84eb56c14620007ff578063dc38b0a21462000823576200021d565b806393b7628f11620000f057806393b7628f14620006c6578063956a3433146200070f578063a741f1cb1462000733578063c708dd141462000766576200021d565b80635ba1d9e51462000648578063715018a6146200066c5780638bf4515c14620006835780638da5cb5b14620006a7576200021d565b80631ccbc6da11620001aa5780634db654f911620001745780634db654f914620005995780634eed7cf114620005b057806354fd4d5014620005f557806358edef4c1462000624576200021d565b80631ccbc6da14620005145780631fbfa127146200053a57806342216bed1462000551578063492c7b2a1462000575576200021d565b8063152a4bb311620001ec578063152a4bb3146200044d5780631a7237e014620004825780631c5ee10c14620004b65780631c993ad514620004f0576200021d565b8063038cd79f146200039a5780630936286114620003c05780631089f40f14620003ef57806311ce02671462000413575b34801562000229575f80fd5b505f366060808284036200024d57505060408051602081019091525f81526200038f565b83835f81811062000262576200026262002a63565b9050013560f81c60f81b6001600160f81b031916602f60f81b14620002ae57505060408051808201909152600e81526d0d2dcc6dee4e4cac6e840e0c2e8d60931b60208201526200038f565b8383620002bd60018262002a8b565b818110620002cf57620002cf62002a63565b909101356001600160f81b031916602f60f81b039050620003315762000328620002fd846001818862002aa1565b600a604051602001620003139392919062002afe565b604051602081830303815290604052620008e7565b50905062000382565b6200037e62000344846001818862002aa1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250620008e792505050565b5090505b6200038d81620009ab565b505b915050805190602001f35b348015620003a6575f80fd5b50620003be620003b836600462002cb8565b620009de565b005b348015620003cc575f80fd5b50620003d7620009fb565b604051620003e6919062002d73565b60405180910390f35b348015620003fb575f80fd5b50620003be6200040d36600462002d8e565b62000a8f565b3480156200041f575f80fd5b5060055462000434906001600160a01b031681565b6040516001600160a01b039091168152602001620003e6565b34801562000459575f80fd5b50620004716200046b36600462002db3565b62000abf565b604051620003e69392919062002e19565b3480156200048e575f80fd5b50620004a6620004a036600462002e3c565b62000b72565b604051620003e692919062002e81565b348015620004c2575f80fd5b50620004da620004d436600462002db3565b62000c1d565b60408051928352602083019190915201620003e6565b348015620004fc575f80fd5b50620003be6200050e36600462002db3565b62000cc1565b34801562000520575f80fd5b506200052b62000cdd565b604051908152602001620003e6565b620003be6200054b36600462002f35565b62000d50565b3480156200055d575f80fd5b506200052b6200056f36600462002e3c565b62000d67565b34801562000581575f80fd5b50620003be6200059336600462002fc0565b62000e00565b620003be620005aa36600462002f35565b62000e1e565b348015620005bc575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000060ff1615155b6040519015158152602001620003e6565b34801562000601575f80fd5b506040805180820190915260058152640312e302e360dc1b6020820152620003d7565b34801562000630575f80fd5b506200052b6200064236600462002db3565b62000f82565b34801562000654575f80fd5b50620005e46200066636600462002e3c565b62001015565b34801562000678575f80fd5b50620003be62001098565b3480156200068f575f80fd5b50620004a6620006a136600462002db3565b620008e7565b348015620006b3575f80fd5b506004546001600160a01b031662000434565b348015620006d2575f80fd5b5062000700620006e436600462002db3565b80516020918201205f9081526009909152604090205460ff1690565b604051620003e6919062003031565b3480156200071b575f80fd5b506200052b6200072d36600462003046565b620010af565b3480156200073f575f80fd5b50620007576200075136600462003067565b6200114f565b604051620003e691906200311d565b34801562000772575f80fd5b50620007576200078436600462003162565b6200120a565b34801562000796575f80fd5b50620007ae620007a836600462002e3c565b620013ae565b60408051928352901515602083015201620003e6565b348015620007d0575f80fd5b50600454620007e990600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620003e6565b3480156200080b575f80fd5b506200052b6200081d36600462002e3c565b6200142b565b3480156200082f575f80fd5b50620003be620008413660046200326a565b620014a4565b34801562000853575f80fd5b50651b585b9d585b60d21b6200052b565b34801562000870575f80fd5b50620005e4620014d0565b34801562000887575f80fd5b50620003be620008993660046200326a565b620014fa565b348015620008ab575f80fd5b50620003be620008bd36600462002fc0565b6200153d565b348015620008cf575f80fd5b506200052b620008e136600462002db3565b6200162e565b60605f805f620009128580516020918201205f8181526009909252604090912054909160ff90911690565b909250905060028160028111156200092e576200092e62002de8565b036200094a576200093f82620016ac565b935093505050915091565b600181600281111562000961576200096162002de8565b0362000972576200093f8262001883565b5f5b6040519080825280601f01601f1916602001820160405280156200099f576020820181803683370190505b50955f95509350505050565b5f81516040620009bc919062003292565b9050601f19620009ce82601f62003292565b1690506020808303528060208303f35b620009e8620019c0565b620009f6835f848462000e00565b505050565b600a805462000a0a9062002aca565b80601f016020809104026020016040519081016040528092919081815260200182805462000a389062002aca565b801562000a875780601f1062000a5d5761010080835404028352916020019162000a87565b820191905f5260205f20905b81548152906001019060200180831162000a6957829003601f168201915b505050505081565b62000a99620019c0565b6004805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b80516020808301919091205f8181526009909252604082205460ff16919081906002848181111562000af55762000af562002de8565b0362000b12575f818152600760205260409020545b925062000b47565b600184600281111562000b295762000b2962002de8565b0362000b43575f8181526002602052604090205462000b0a565b5f92505b6005546001600160a01b031662000b5f575f62000b69565b62000b6962000cdd565b93959294505050565b60605f805f62000b9d8680516020918201205f8181526009909252604090912054909160ff90911690565b9092509050600281600281111562000bb95762000bb962002de8565b0362000bd75762000bcb8286620019ef565b93509350505062000c16565b600181600281111562000bee5762000bee62002de8565b0362000c005762000bcb828662001ac6565b5050604080515f80825260208201909252925090505b9250929050565b80516020808301919091205f8181526009909252604082205482919060ff166002818181111562000c525762000c5262002de8565b0362000c78575f828152600860209081526040808320546007909252909120546200093f565b600181600281111562000c8f5762000c8f62002de8565b0362000cb5575f828152600360209081526040808320546002909252909120546200093f565b505f9485945092505050565b62000ccb620019c0565b600a62000cd98282620032f1565b5050565b60055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562000d25573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000d4b9190620033b9565b905090565b62000d5a620019c0565b620009f683838362000e1e565b81516020808401919091205f8181526009909252604082205460ff166002818181111562000d995762000d9962002de8565b0362000db55762000dab8285620010af565b9250505062000dfa565b600181600281111562000dcc5762000dcc62002de8565b0362000df4575f62000ddf838662001ac6565b508051602090910120935062000dfa92505050565b505f9150505b92915050565b62000e0a620019c0565b62000e18848484846200153d565b50505050565b62000e28620019c0565b62000e32620014d0565b62000e9d5760405162461bcd60e51b815260206004820152603060248201527f5468652063757272656e74206e6574776f726b20646f6573206e6f742073757060448201526f1c1bdc9d08189b1bd8881d5c1b1bd85960821b60648201526084015b60405180910390fd5b82516020808501919091205f81815260099092526040822054909160ff9091169081600281111562000ed35762000ed362002de8565b148062000ef45750600281600281111562000ef25762000ef262002de8565b145b62000f395760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e94565b5f81600281111562000f4f5762000f4f62002de8565b0362000f6e575f828152600960205260409020805460ff191660021790555b62000f7b82858562001b39565b5050505050565b5f62000f8d620019c0565b81516020808401919091205f81815260099092526040909120805460ff19811690915560ff166002818181111562000fc95762000fc962002de8565b0362000fe35762000fdb825f62001e56565b949350505050565b600181600281111562000ffa5762000ffa62002de8565b036200100c5762000fdb825f62001f83565b505f9392505050565b5f62001020620019c0565b82516020808501919091205f818152600990925260409091205460ff166002818181111562001053576200105362002de8565b03620010655762000dab828562002024565b60018160028111156200107c576200107c62002de8565b036200108e5762000dab828562002146565b505f949350505050565b620010a2620019c0565b620010ad5f620021d7565b565b6005545f83815260066020908152604080832085845290915280822054905163d8389dc560e01b815291926001600160a01b03169163d8389dc591620010fb9160040190815260200190565b602060405180830381865afa15801562001117573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200113d9190620033d1565b67ffffffffffffffff19169392505050565b60605f82516001600160401b038111156200116e576200116e62002b85565b60405190808252806020026020018201604052801562001198578160200160208202803683370190505b5090505f5b83518110156200120357620011ce848281518110620011c057620011c062002a63565b60200260200101516200162e565b828281518110620011e357620011e362002a63565b602090810291909101015280620011fa81620033fb565b9150506200119d565b5092915050565b60605f805b83518110156200125f578381815181106200122e576200122e62002a63565b602002602001015160200151518262001248919062003292565b9150806200125681620033fb565b9150506200120f565b505f816001600160401b038111156200127c576200127c62002b85565b604051908082528060200260200182016040528015620012a6578160200160208202803683370190505b5090505f805b8551811015620013a4575f5b868281518110620012cd57620012cd62002a63565b602002602001015160200151518110156200138e5762001349878381518110620012fb57620012fb62002a63565b60200260200101515f01518884815181106200131b576200131b62002a63565b60200260200101516020015183815181106200133b576200133b62002a63565b602002602001015162000d67565b8484815181106200135e576200135e62002a63565b6020908102919091010152826200137581620033fb565b93505080806200138590620033fb565b915050620012b8565b50806200139b81620033fb565b915050620012ac565b5090949350505050565b81516020808401919091205f8181526009909252604082205482919060ff1660028181811115620013e357620013e362002de8565b03620013f55762000bcb828662002228565b60018160028111156200140c576200140c62002de8565b036200141e5762000bcb8286620022e4565b505f958695509350505050565b5f62001436620019c0565b82516020808501919091205f818152600990925260409091205460ff166002818181111562001469576200146962002de8565b036200147b5762000dab828562001e56565b600181600281111562001492576200149262002de8565b036200108e5762000dab828562001f83565b620014ae620019c0565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005545f906001600160a01b03161580159062000d4b57505f620014f362000cdd565b1015905090565b62001504620019c0565b6001600160a01b0381166200152f57604051631e4fbdf760e01b81525f600482015260240162000e94565b6200153a81620021d7565b50565b62001547620019c0565b83516020808601919091205f81815260099092526040822054909160ff909116908160028111156200157d576200157d62002de8565b14806200159e575060018160028111156200159c576200159c62002de8565b145b620015e35760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073746f72616765206d6f646560601b604482015260640162000e94565b5f816002811115620015f957620015f962002de8565b0362001618575f828152600960205260409020805460ff191660011790555b620016268286868662002337565b505050505050565b80516020808301919091205f8181526009909252604082205460ff166002818181111562001660576200166062002de8565b036200167b57505f9081526007602052604090205492915050565b600181600281111562001692576200169262002de8565b036200100c575f8281526002602052604090205462000fdb565b60605f805f620016d4855f908152600860209081526040808320546007909252909120549091565b91509150805f03620016e7575f62000974565b5f826001600160401b0381111562001703576200170362002b85565b6040519080825280601f01601f1916602001820160405280156200172e576020820181803683370190505b5090505f805b8381101562001874575f88815260066020908152604080832084845290915280822054600554915163afd5644d60e01b8152600481018290529092916001600160a01b03169063afd5644d90602401602060405180830381865afa1580156200179f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017c59190620033b9565b60055460405163bea94b8b60e01b81529192506001600160a01b03169063bea94b8b90620017ff9085906002905f90879060040162003416565b5f60405180830381865afa1580156200181a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001843919081019062003443565b508060406020868801013e6200185a818562003292565b9350505080806200186b90620033fb565b91505062001734565b50909660019650945050505050565b60605f805f620018ab855f908152600360209081526040808320546002909252909120549091565b91509150805f03620018be575f62000974565b5f826001600160401b03811115620018da57620018da62002b85565b6040519080825280601f01601f19166020018201604052801562001905576020820181803683370190505b509050602081015f5b8381101562001874575f88815260208181526040808320848452909152812054906200193a826200241b565b156200197b576200194b8260e01c90565b5f8b81526001602090815260408083208784529091529020909150620019739083866200242f565b50506200199a565b816200198781620024df565b50915062001996818662002504565b5050505b620019a6818562003292565b935050508080620019b790620033fb565b9150506200190e565b6004546001600160a01b03163314620010ad5760405163118cdaa760e01b815233600482015260240162000e94565b60605f80620019ff858562002228565b509050600181101562001a25575050604080515f80825260208201909252915062000c16565b6005545f86815260066020908152604080832088845290915280822054905163bea94b8b60e01b815291926001600160a01b03169163bea94b8b9162001a75916002908690889060040162003416565b5f60405180830381865afa15801562001a90573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405262001ab9919081019062003443565b9660019650945050505050565b5f828152602081815260408083208484529091528120546060919062001aec816200241b565b1562001b23575f858152600160209081526040808320878452909152902062001b1690826200253c565b6001925092505062000c16565b62001b2e81620025df565b925092505062000c16565b815160055460408051630e65e36d60e11b815290515f926001600160a01b031691631ccbc6da9160048083019260209291908290030181865afa15801562001b83573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ba99190620033b9565b905062001bb78282620034bd565b34101562001bff5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640162000e94565b5f5b82811015620016265783818151811062001c1f5762001c1f62002a63565b60200260200101515f10801562001c6a5750600460149054906101000a900463ffffffff1663ffffffff1684828151811062001c5f5762001c5f62002a63565b602002602001015111155b62001caf5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840c6d0eadcd640d8cadccee8d60631b604482015260640162000e94565b62001cf48686838151811062001cc95762001cc962002a63565b602002602001015186848151811062001ce65762001ce662002a63565b60200260200101516200265e565b5f338787848151811062001d0c5762001d0c62002a63565b602002602001015160405160200162001d43939291906001600160a01b039390931683526020830191909152604082015260600190565b60405160208183030381529060405280519060200120905060055f9054906101000a90046001600160a01b03166001600160a01b0316634581a92084838589878151811062001d965762001d9662002a63565b60200260200101516040518563ffffffff1660e01b815260040162001dce939291909283526020830191909152604082015260600190565b5f604051808303818588803b15801562001de6575f80fd5b505af115801562001df9573d5f803e3d5ffd5b50505050508060065f8981526020019081526020015f205f88858151811062001e265762001e2662002a63565b602002602001015181526020019081526020015f208190555050808062001e4d90620033fb565b91505062001c01565b5f5b5f8381526006602090815260408083208584529091529020541562001f7d576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d9162001ec39160040190815260200190565b602060405180830381865afa15801562001edf573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001f059190620033b9565b90508060085f8681526020019081526020015f205f82825462001f29919062002a8b565b90915550505f84815260066020908152604080832086845282528083208390558683526007909152812080549162001f6183620034d7565b9190505550828062001f7390620033fb565b9350505062001e58565b50919050565b5f5b5f838152602081815260408083208584529091529020541562001f7d575f62001faf8484620022e4565b505f8581526020818152604080832087845282528083208390558783526002909152812080549293509062001fe483620034d7565b90915550505f84815260036020526040812080548392906200200890849062002a8b565b909155508390506200201a81620033fb565b9350505062001f85565b5f82815260076020526040812054620020409060019062002a8b565b82146200204f57505f62000dfa565b6005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d916200209b9160040190815260200190565b602060405180830381865afa158015620020b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620020dd9190620033b9565b5f8581526006602090815260408083208784528252808320839055878352600790915281208054929350906200211383620034d7565b90915550505f84815260086020526040812080548392906200213790849062002a8b565b90915550600195945050505050565b5f82815260026020526040812054620021629060019062002a8b565b82146200217157505f62000dfa565b5f6200217e8484620022e4565b505f85815260208181526040808320878452825280832083905587835260029091528120805492935090620021b383620034d7565b90915550505f84815260036020526040812080548392906200213790849062002a8b565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f82815260076020526040812054819083106200224a57505f90508062000c16565b6005545f85815260066020908152604080832087845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620022969160040190815260200190565b602060405180830381865afa158015620022b2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620022d89190620033b9565b95600195509350505050565b5f8281526020818152604080832084845290915281205481908062002310575f80925092505062000c16565b6200231b816200241b565b156200232c5762001b168160e01c90565b62001b2e81620024df565b62002344848483620027d5565b60ff7f000000000000000000000000000000000000000000000000000000000000000016811115620023a9576200238c620023808383620028f7565b6001600160a01b031690565b5f8581526020818152604080832087845290915290205562000e18565b5f8481526001602090815260408083208684528252918290208251601f8501839004830281018301909352838352620023fe92909185908590819084018382808284375f920191909152506200293992505050565b5f8581526020818152604080832087845290915290205550505050565b5f80620024288360e01c90565b1192915050565b5f805f6200243d85620029d1565b808652909350905083601c841115620024d157601c81015f805b6020600162002468601c8a62002a8b565b6200247590602062003292565b62002481919062002a8b565b6200248d9190620034ef565b811015620024cd575f81815260208b81526040909120548085529250620024b690849062003292565b925080620024c481620033fb565b91505062002457565b5050505b600192505050935093915050565b5f806001600160a01b038316620024fa57505f928392509050565b50503b9081151590565b5f805f806200251386620024df565b91509150806200252b575f8093509350505062000c16565b815f86883c50946001945092505050565b60605f6200254a83620029eb565b92509050601c8111156200120357603c82015f805b6020600162002570601c8762002a8b565b6200257d90602062003292565b62002589919062002a8b565b620025959190620034ef565b811015620025d5575f81815260208881526040909120548085529250620025be90849062003292565b925080620025cc81620033fb565b9150506200255f565b5050505092915050565b60605f805f620025ef85620024df565b915091508062002600575f62000974565b5f826001600160401b038111156200261c576200261c62002b85565b6040519080825280601f01601f19166020018201604052801562002647576020820181803683370190505b509050825f60208301883c95600195509350505050565b5f83815260076020526040902054821115620026b65760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e94565b5f838152600760205260409020548210156200278b576005545f84815260066020908152604080832086845290915280822054905163afd5644d60e01b815291926001600160a01b03169163afd5644d91620027189160040190815260200190565b602060405180830381865afa15801562002734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200275a9190620033b9565b90508060085f8681526020019081526020015f205f8282546200277e919062002a8b565b90915550620027ac915050565b5f838152600760205260408120805491620027a683620033fb565b91905055505b5f8381526008602052604081208054839290620027cb90849062003292565b9091555050505050565b5f838152602081815260408083208584529091529020548062002894578215806200282757505f848152602081905260408120816200281660018762002a8b565b81526020019081526020015f205414155b6200286e5760405162461bcd60e51b81526020600482015260166024820152751b5d5cdd081c995c1b1858d9481bdc88185c1c195b9960521b604482015260640162000e94565b5f8481526002602052604081208054916200288983620033fb565b9190505550620028cd565b5f620028a18585620022e4565b5090508060035f8781526020019081526020015f205f828254620028c6919062002a8b565b9091555050505b5f8481526003602052604081208054849290620028ec90849062003292565b909155505050505050565b5f808383604051620029099062002a55565b620029169291906200350f565b604051809103905ff08015801562002930573d5f803e3d5ffd5b50949350505050565b805160208083015160e083901b911c1790601c81111562001203575f603c8401815b602060016200296c601c8762002a8b565b6200297990602062003292565b62002985919062002a8b565b620029919190620034ef565b811015620025d55781519250620029aa82602062003292565b5f828152602089905260409020849055915080620029c881620033fb565b9150506200295b565b5f80620029de8360e01c90565b9360209390931b92915050565b5f6060620029f98360e01c90565b9150602083901b9250816001600160401b0381111562002a1d5762002a1d62002b85565b6040519080825280601f01601f19166020018201604052801562002a48576020820181803683370190505b5060208101939093525091565b61010e806200353e83390190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111562000dfa5762000dfa62002a77565b5f808585111562002ab0575f80fd5b8386111562002abd575f80fd5b5050820193919092039150565b600181811c9082168062002adf57607f821691505b60208210810362001f7d57634e487b7160e01b5f52602260045260245ffd5b828482375f8382015f81525f845462002b178162002aca565b6001828116801562002b32576001811462002b485762002b76565b60ff198416865282151583028601945062002b76565b885f526020805f205f5b8581101562002b6d5781548982015290840190820162002b52565b50505082860194505b50929998505050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171562002bbe5762002bbe62002b85565b60405290565b604051601f8201601f191681016001600160401b038111828210171562002bef5762002bef62002b85565b604052919050565b5f6001600160401b0382111562002c125762002c1262002b85565b50601f01601f191660200190565b5f82601f83011262002c30575f80fd5b813562002c4762002c418262002bf7565b62002bc4565b81815284602083860101111562002c5c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8083601f84011262002c89575f80fd5b5081356001600160401b0381111562002ca0575f80fd5b60208301915083602082850101111562000c16575f80fd5b5f805f6040848603121562002ccb575f80fd5b83356001600160401b038082111562002ce2575f80fd5b62002cf08783880162002c20565b9450602086013591508082111562002d06575f80fd5b5062002d158682870162002c78565b9497909650939450505050565b5f5b8381101562002d3e57818101518382015260200162002d24565b50505f910152565b5f815180845262002d5f81602086016020860162002d22565b601f01601f19169290920160200192915050565b602081525f62002d87602083018462002d46565b9392505050565b5f6020828403121562002d9f575f80fd5b813563ffffffff8116811462002d87575f80fd5b5f6020828403121562002dc4575f80fd5b81356001600160401b0381111562002dda575f80fd5b62000fdb8482850162002c20565b634e487b7160e01b5f52602160045260245ffd5b600381106200153a57634e487b7160e01b5f52602160045260245ffd5b6060810162002e288562002dfc565b938152602081019290925260409091015290565b5f806040838503121562002e4e575f80fd5b82356001600160401b0381111562002e64575f80fd5b62002e728582860162002c20565b95602094909401359450505050565b604081525f62002e95604083018562002d46565b905082151560208301529392505050565b5f6001600160401b0382111562002ec15762002ec162002b85565b5060051b60200190565b5f82601f83011262002edb575f80fd5b8135602062002eee62002c418362002ea6565b82815260059290921b8401810191818101908684111562002f0d575f80fd5b8286015b8481101562002f2a578035835291830191830162002f11565b509695505050505050565b5f805f6060848603121562002f48575f80fd5b83356001600160401b038082111562002f5f575f80fd5b62002f6d8783880162002c20565b9450602086013591508082111562002f83575f80fd5b62002f918783880162002ecb565b9350604086013591508082111562002fa7575f80fd5b5062002fb68682870162002ecb565b9150509250925092565b5f805f806060858703121562002fd4575f80fd5b84356001600160401b038082111562002feb575f80fd5b62002ff98883890162002c20565b955060208701359450604087013591508082111562003016575f80fd5b50620030258782880162002c78565b95989497509550505050565b60208101620030408362002dfc565b91905290565b5f806040838503121562003058575f80fd5b50508035926020909101359150565b5f602080838503121562003079575f80fd5b82356001600160401b038082111562003090575f80fd5b818501915085601f830112620030a4575f80fd5b8135620030b562002c418262002ea6565b81815260059190911b83018401908481019088831115620030d4575f80fd5b8585015b838110156200311057803585811115620030f1575f8081fd5b620031018b89838a010162002c20565b845250918601918601620030d8565b5098975050505050505050565b602080825282518282018190525f9190848201906040850190845b81811015620031565783518352928401929184019160010162003138565b50909695505050505050565b5f602080838503121562003174575f80fd5b82356001600160401b03808211156200318b575f80fd5b818501915085601f8301126200319f575f80fd5b8135620031b062002c418262002ea6565b81815260059190911b83018401908481019088831115620031cf575f80fd5b8585015b838110156200311057803585811115620031ec575f8081fd5b86016040818c03601f190181131562003204575f8081fd5b6200320e62002b99565b898301358881111562003220575f8081fd5b620032308e8c8387010162002c20565b82525090820135908782111562003246575f8081fd5b620032568d8b8486010162002ecb565b818b015285525050918601918601620031d3565b5f602082840312156200327b575f80fd5b81356001600160a01b038116811462002d87575f80fd5b8082018082111562000dfa5762000dfa62002a77565b601f821115620009f6575f81815260208120601f850160051c81016020861015620032d05750805b601f850160051c820191505b818110156200162657828155600101620032dc565b81516001600160401b038111156200330d576200330d62002b85565b62003325816200331e845462002aca565b84620032a8565b602080601f8311600181146200335b575f8415620033435750858301515b5f19600386901b1c1916600185901b17855562001626565b5f85815260208120601f198616915b828110156200338b578886015182559484019460019091019084016200336a565b5085821015620033a957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620033ca575f80fd5b5051919050565b5f60208284031215620033e2575f80fd5b815167ffffffffffffffff198116811462002d87575f80fd5b5f600182016200340f576200340f62002a77565b5060010190565b84815260808101620034288562002dfc565b84602083015283604083015282606083015295945050505050565b5f6020828403121562003454575f80fd5b81516001600160401b038111156200346a575f80fd5b8201601f810184136200347b575f80fd5b80516200348c62002c418262002bf7565b818152856020838501011115620034a1575f80fd5b620034b482602083016020860162002d22565b95945050505050565b808202811582820484141762000dfa5762000dfa62002a77565b5f81620034e857620034e862002a77565b505f190190565b5f826200350a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208152816020820152818360408301375f818301604090810191909152601f909201601f1916010191905056fe608060405234801561000f575f80fd5b5060405161010e38038061010e83398101604081905261002e9161004b565b80518060208301f35b634e487b7160e01b5f52604160045260245ffd5b5f602080838503121561005c575f80fd5b82516001600160401b0380821115610072575f80fd5b818501915085601f830112610085575f80fd5b81518181111561009757610097610037565b604051601f8201601f19908116603f011681019083821181831017156100bf576100bf610037565b8160405282815288868487010111156100d6575f80fd5b5f93505b828410156100f757848401860151818501870152928501926100da565b5f8684830101528096505050505050509291505056fea2646970667358221220013539101ab7ca3f2eb49334c743f86ec8a7b0cbff5788ba7432c9959515da3164736f6c63430008140033";
var FLAT_DIRECTORY_CONTRACT_VERSION_1_0_0 = "1.0.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");
var MIN_BLOB_GASPRICE = 1n;
var BLOB_GASPRICE_UPDATE_FRACTION = 3338477n;
function fakeExponential(factor, numerator, denominator) {
let i = 1n;
let output = 0n;
let numerator_accum = factor * denominator;
while (numerator_accum > 0n) {
output += numerator_accum;
numerator_accum = numerator_accum * numerator / (denominator * i);
i++;
}
return output / denominator;
}
var BlobUploader = class {
constructor(rpc, pk) {
this.provider = new import_ethers2.ethers.JsonRpcProvider(rpc);
this.wallet = new import_ethers2.ethers.Wallet(pk, this.provider);
this.mutex = new import_async_mutex.Mutex();
this.kzg = new import_js_kzg.KZG();
}
async getBlobGasPrice() {
const block = await this.provider.getBlock("latest");
if (block === null || block.excessBlobGas === null) {
throw new Error("Block has no excessBlobGas");
}
const excessBlobGas = BigInt(block.excessBlobGas);
const gas = fakeExponential(MIN_BLOB_GASPRICE, excessBlobGas, BLOB_GASPRICE_UPDATE_FRACTION);
return gas * 11n / 10n;
}
async getGasPrice() {
return await this.provider.getFeeData();
}
async sendTx(tx, blobs = null, commitments = null) {
return await this.send(tx, blobs, commitments, false);
}
async sendTxLock(tx, blobs = null, commitments = null) {
return await this.send(tx, blobs, commitments, true);
}
async send(tx, blobs = null, commitments = null, isLock = false) {
if (!blobs) {
return isLock ? await this.lockSend(tx) : await this.wallet.sendTransaction(tx);
}
if (tx.maxFeePerBlobGas == null) {
tx.maxFeePerBlobGas = await this.getBlobGasPrice();
}
const fullCommitments = commitments && commitments.length === blobs.length ? commitments : await this.kzg.computeCommitmentBatch(blobs);
const proofs = await this.kzg.computeProofBatch(blobs, fullCommitments);
const ethersBlobs = blobs.map((blob, i) => ({
data: blob,
proof: proofs[i],
commitment: fullCommitments[i]
}));
const versionedHashes = fullCommitments.map(
(commitment) => import_ethers2.ethers.hexlify(computeVersionedCommitmentHash(commitment))
);
tx.type = 3;
tx.blobVersionedHashes = versionedHashes;
tx.blobs = ethersBlobs;
return isLock ? await this.lockSend(tx) : await this.wallet.sendTransaction(tx);
}
async lockSend(tx) {
const release = await this.mutex.acquire();
try {
return await this.wallet.sendTransaction(tx);
} finally {
release();
}
}
async computeCommitmentsForBlobs(blobs) {
return await this.kzg.computeCommitmentBatch(blobs);
}
async computeEthStorageHashesForBlobs(blobs) {
const commitments = await this.computeCommitmentsForBlobs(blobs);
return convertToEthStorageHashes(commitments);
}
async close() {
await this.kzg.close();
}
};
// src/utils/web3.ts
async function getUploadInfo(contract, hexName, retries) {
const result = await retry(() => contract["getUploadInfo"](hexName), retries);
return {
fileMode: Number(result[0]),
oldChunkCount: Number(result[1]),
cost: result[2]
};
}
async function getChunkCounts(contract, batch, retries) {
const names = batch.map((key) => stringToHex(key));
const counts = await retry(() => contract["getChunkCountsBatch"](names), retries);
const results = [];
let index = 0;
for (const key of batch) {
results.push({ key, chunkCount: Number(counts[index++]) });
}
return results;
}
async function getChunkHashes(contract, batch, retries) {
const fileChunks = batch.map((file) => [
stringToHex(file.name),
file.chunkIds
]);
const hashes = await retry(() => contract["getChunkHashesBatch"](fileChunks), retries);
const results = [];
let index = 0;
for (const file of batch) {
for (let j = 0; j < file.chunkIds.length; j++) {
results.push({ name: file.name, chunkId: file.chunkIds[j], hash: hashes[index++] });
}
}
return results;
}
// src/ethstorage.ts
var import_ethers3 = require("ethers");
var EthStorage = class _EthStorage {
static async create(config) {
const ethStorage = new _EthStorage();
await ethStorage.init(config);
return ethStorage;
}
async init(config) {
const { rpc, privateKey, ethStorageRpc, address } = config;
if (address) {
this.contractAddr = address;
} else if (rpc) {
const chainId = await getChainId(rpc);
this.contractAddr = ETHSTORAGE_MAPPING[chainId];
}
if (!this.contractAddr) {
throw new Error("EthStorage: Network not supported yet.");
}
this.ethStorageRpc = ethStorageRpc;
if (privateKey && rpc) {
const provider = new import_ethers3.ethers.JsonRpcProvider(rpc);
this.wallet = new import_ethers3.ethers.Wallet(privateKey, provider);
this.blobUploader = new BlobUploader(rpc, privateKey);
}
}
async estimateCost(key, data) {
this.checkData(data);
const hexKey = import_ethers3.ethers.keccak256(stringToHex(key));
const contract = new import_ethers3.ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);
const [storageCost, maxFeePerBlobGas, gasFeeData] = await Promise.all([
contract["upfrontPayment"](),
this._blobUploader.getBlobGasPrice(),
this._blobUploader.getGasPrice()
]);
const gasLimit = await contract["putBlob"].estimateGas(hexKey, 0, data.length, {
value: storageCost,
// Fixed dummy hashing to bypass the limitation that contracts need versioned hash when estimating gasLimit.
blobVersionedHashes: [DUMMY_VERSIONED_COMMITMENT_HASH]
});
const totalGasCost = (gasFeeData.maxFeePerGas + gasFeeData.maxPriorityFeePerGas) * gasLimit;
const totalBlobGasCost = maxFeePerBlobGas * BigInt(BLOB_SIZE);
const gasCost = totalGasCost + totalBlobGasCost;
return {
storageCost,
gasCost
};
}
async write(key, data) {
this.checkData(data);
const contract = new import_ethers3.ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);
const hexKey = import_ethers3.ethers.keccak256(stringToHex(key));
try {
const storageCost = await contract["upfrontPayment"]();
const tx = await contract["putBlob"].populateTransaction(hexKey, 0, data.length, {
value: storageCost
});
const blobs = encodeOpBlobs(data);
const txRes = await this._blobUploader.sendTx(tx, blobs);
console.log(`EthStorage: Tx hash is ${txRes.hash}`);
const receipt = await txRes.wait();
return { hash: txRes.hash, success: receipt?.status === 1 };
} catch (e) {
console.error(`EthStorage: Write blob failed!`, e.message);
}
return { hash: "0x", success: false };
}
async read(key, decodeType = 2 /* OptimismCompact */, address) {
if (!key) {
throw new Error(`EthStorage: Invalid key.`);
}
const fromAddress = this.wallet?.address || address;
if (!fromAddress) {
throw new Error(`EthStorage: Read operation requires an address when 'wallet' is not available.`);
}
const hexKey = import_ethers3.ethers.keccak256(stringToHex(key));
const provider = new import_ethers3.ethers.JsonRpcProvider(this._ethStorageRpc);
const contract = new import_ethers3.ethers.Contract(this.contractAddr, EthStorageAbi, provider);
const size = await contract.size(hexKey, {
from: fromAddress
});
if (size === 0n) {
throw new Error(`EthStorage: There is no data corresponding to key ${key} under wallet address ${fromAddress}.`);
}
const data = await contract.get(hexKey, decodeType, 0, size, {
from: fromAddress
});
return import_ethers3.ethers.getBytes(data);
}
async writeBlobs(keys, dataBlobs) {
if (!keys || !dataBlobs) {
throw new Error(`EthStorage: Invalid parameter.`);
}
if (keys.length !== dataBlobs.length) {
throw new Error(`EthStorage: The number of keys and data does not match.`);
}
if (keys.length > BLOB_COUNT_LIMIT) {
throw new Error(`EthStorage: The count exceeds the maximum blob limit.`);
}
const blobLength = keys.length;
const blobArr = [];
const keyArr = [];
const idArr = [];
const lengthArr = [];
for (let i = 0; i < blobLength; i++) {
const data = dataBlobs[i];
this.checkData(data);
const blob = encodeOpBlobs(data);
blobArr.push(blob[0]);
keyArr.push(import_ethers3.ethers.keccak256(stringToHex(keys[i])));
idArr.push(i);
lengthArr.push(data.length);
}
const contract = new import_ethers3.ethers.Contract(this.contractAddr, EthStorageAbi, this._wallet);
try {
const storageCost = await contract["upfrontPayment"]();
const tx = await contract["putBlobs"].populateTransaction(keyArr, idArr, lengthArr, {
value: storageCost * BigInt(blobLength)
});
const txRes = await this._blobUploader.sendTx(tx, blobArr);
console.log(`EthStorage: Tx hash is ${txRes.hash}`);
const receipt = await txRes.wait();
return { hash: txRes.hash, success: receipt?.status === 1 };
} catch (e) {
console.error(`EthStorage: Put blobs failed!`, e.message);
}
return { hash: "0x", success: false };
}
async close() {
if (this.blobUploader) {
await this.blobUploader.close();
}
}
// get
get _wallet() {
if (!this.wallet) {
throw new Error("EthStorage: Private key is required for this operation.");
}
return this.wallet;
}
get _blobUpl