import "../_dnt.polyfills.js"; import { twox128 } from "../crypto/mod.js" import * as $ from "../deps/scale.js" export function $storageKey( palletName: string, entryName: string, $key: $.Codec, ): $.Codec { const palletHash = twox128.hash(new TextEncoder().encode(palletName)) const entryHash = twox128.hash(new TextEncoder().encode(entryName)) return $.createCodec({ _metadata: $.metadata("$storageKey", $storageKey, palletName, entryName, $key), _staticSize: $key._staticSize + 32, _encode(buffer, key) { buffer.insertArray(palletHash) buffer.insertArray(entryHash) $key._encode(buffer, key) }, _decode(buffer) { // Ignore initial hashes buffer.index += 32 return $key._decode(buffer) }, _assert(assert) { $key._assert(assert) }, }) } export const $emptyKey = $.withMetadata($.metadata("$emptyKey"), $.constant(undefined)) export const $partialEmptyKey = $.createCodec({ _metadata: $.metadata("$partialEmptyKey"), _staticSize: 0, _encode() {}, _decode() { throw new Error("Cannot decode partial key") }, _assert(assert) { if (assert.value != null) { throw new $.ScaleAssertError(this, assert.value, `${assert.path} != null`) } }, }) export function $partialSingleKey($inner: $.Codec): $.Codec { return $.createCodec({ _metadata: $.metadata("$partialSingleKey", $partialSingleKey, $inner), _staticSize: $inner._staticSize, _encode(buffer, key) { if (key !== null) $inner._encode(buffer, key) }, _decode() { throw new Error("Cannot decode partial key") }, _assert(assert) { if (assert.value === null) return $inner._assert(assert) }, }) } export type PartialMultiKey = T extends [...infer A, any] ? T | PartialMultiKey : T | null export function $partialMultiKey( ...keys: [...T] ): $.Codec>> export function $partialMultiKey(...codecs: $.Codec[]): $.Codec { return $.createCodec({ _metadata: $.metadata("$partialMultiKey", $partialMultiKey, ...codecs), _staticSize: $.tuple(...codecs)._staticSize, _encode(buffer, key) { if (!key) return for (let i = 0; i < key.length; i++) { codecs[i]!._encode(buffer, key[i]!) } }, _decode() { throw new Error("Cannot decode partial key") }, _assert(assert) { if (assert.value === null) return assert.instanceof(this, Array) const assertLength = assert.key(this, "length") assertLength.typeof(this, "number") const length = assertLength.value as number $.tuple(...codecs.slice(0, length))._assert(assert) }, }) }