@talismn/sapi 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
1
|
# @talismn/sapi
|
|
2
|
+
|
|
3
|
+
Scale API: a helper over [polkadot-api](https://papi.how) for Polkadot SDK chains. Create one with `getScaleApi(connector, metadata, token)`, then use it to:
|
|
4
|
+
|
|
5
|
+
- read constants, storage and runtime API values
|
|
6
|
+
- decode calls and extrinsics
|
|
7
|
+
- build `SignerPayloadJSON` payloads, including custom signed extensions
|
|
8
|
+
- estimate fees and dry-run calls
|
|
9
|
+
- submit signed extrinsics
|
|
10
|
+
|
|
11
|
+
It also exports interop types for polkadot-js style payloads.
|
package/dist/index.js
CHANGED
|
@@ -182,12 +182,12 @@ const getSignerPayloadJSON = async (chain, palletName, methodName, args, signerC
|
|
|
182
182
|
getStorageValue(chain, "System", "Number", [])
|
|
183
183
|
]);
|
|
184
184
|
if (!genesisHash) throw new Error("Genesis hash not found");
|
|
185
|
-
if (!blockHash) throw new Error("Block hash not found");
|
|
186
185
|
let blockNumber = blockNumberFinalized;
|
|
187
186
|
if (blockNumberCurrent - blockNumberFinalized > 32) {
|
|
188
187
|
blockNumber = blockNumberCurrent - 16;
|
|
189
188
|
blockHash = await getStorageValue(chain, "System", "BlockHash", [blockNumber]);
|
|
190
189
|
}
|
|
190
|
+
if (!blockHash) throw new Error("Block hash not found");
|
|
191
191
|
const era = mortal({
|
|
192
192
|
period: 64,
|
|
193
193
|
phase: blockNumber % 64
|
|
@@ -401,8 +401,8 @@ const DISPATCH_ERROR = {
|
|
|
401
401
|
Blocked: "Account cannot receive the assets"
|
|
402
402
|
},
|
|
403
403
|
Arithmetic: {
|
|
404
|
-
Overflow: "An
|
|
405
|
-
Underflow: "An
|
|
404
|
+
Overflow: "An overflow would occur",
|
|
405
|
+
Underflow: "An underflow would occur",
|
|
406
406
|
DivisionByZero: "Division by zero"
|
|
407
407
|
},
|
|
408
408
|
Transactional: {
|
|
@@ -419,9 +419,9 @@ const DISPATCH_ERROR = {
|
|
|
419
419
|
const getModuleErrorMessage = (chain, error) => {
|
|
420
420
|
try {
|
|
421
421
|
if (!chain.metadata) throw new Error("Could not fetch metadata");
|
|
422
|
-
const
|
|
423
|
-
if (typeof
|
|
424
|
-
const palletErrors = (0, _polkadot_api_metadata_builders.getLookupFn)(chain.metadata)(
|
|
422
|
+
const errorsType = chain.metadata.pallets.find((p) => p.name === error.type)?.errors?.type;
|
|
423
|
+
if (typeof errorsType !== "number") throw new Error("Unknown pallet");
|
|
424
|
+
const palletErrors = (0, _polkadot_api_metadata_builders.getLookupFn)(chain.metadata)(errorsType);
|
|
425
425
|
if (palletErrors.type !== "enum" || !palletErrors.innerDocs[error.value.type]?.length) throw new Error("Unknown error type");
|
|
426
426
|
return palletErrors.innerDocs[error.value.type].join(" ");
|
|
427
427
|
} catch (err) {
|
|
@@ -509,7 +509,7 @@ const getFeeEstimate = async (chain, payload) => {
|
|
|
509
509
|
const signedTx = (0, _polkadot_api_signers_common.createV4Tx)(chain.metadata, getAddressBytes(payload.address), fakeSignature, [extra], callData);
|
|
510
510
|
const bytes = stripLengthPrefix(signedTx);
|
|
511
511
|
try {
|
|
512
|
-
const result = await getRuntimeCallResult(chain, "TransactionPaymentApi", "query_info", [bytes,
|
|
512
|
+
const result = await getRuntimeCallResult(chain, "TransactionPaymentApi", "query_info", [bytes, signedTx.length]);
|
|
513
513
|
if (!result?.partial_fee && result.partial_fee !== 0n) throw new Error("partialFee is not found");
|
|
514
514
|
return result.partial_fee;
|
|
515
515
|
} catch (err) {
|
|
@@ -541,9 +541,9 @@ const hasConstant = (chain, pallet, constant) => {
|
|
|
541
541
|
//#region src/helpers/hasEvent.ts
|
|
542
542
|
const hasEvent = (chain, pallet, event) => {
|
|
543
543
|
try {
|
|
544
|
-
const
|
|
545
|
-
if (typeof
|
|
546
|
-
const palletEvents = (0, _polkadot_api_metadata_builders.getLookupFn)(chain.metadata)(
|
|
544
|
+
const eventsType = chain.metadata.pallets.find((p) => p.name === pallet)?.events?.type;
|
|
545
|
+
if (typeof eventsType !== "number") return false;
|
|
546
|
+
const palletEvents = (0, _polkadot_api_metadata_builders.getLookupFn)(chain.metadata)(eventsType);
|
|
547
547
|
return palletEvents.type === "enum" && event in palletEvents.innerDocs;
|
|
548
548
|
} catch (err) {
|
|
549
549
|
log_default.error("Failed to check event existence", {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["compactNumber","Vector","u32","toHex","packageJson.name","merkleizeMetadata","toHex","getPjsTxHelper","mergeUint8","enhanceEncoder","Bytes","u16","fromHex","getSs58AddressInfo","mergeUint8","Binary","toHex","getConstantValueFromMetadata","Bytes","Struct","enhanceDecoder","createDecoder","compactNumber","extrinsicFormat","u8","getLookupFn","toHex","Enum","mergeUint8","u32","toHex","fromHex","u128","getPjsTxHelper","createV4Tx","getLookupFn","parseMetadataRpc"],"sources":["../src/customSignedExtensions.ts","../src/fetchBestMetadata.ts","../package.json","../src/log.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getDryRunCall.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/hasConstant.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts","../src/sapi.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport type { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\n\ntype CustomExtensionMappers = NonNullable<Parameters<typeof getPjsTxHelper>[1]>\n\nconst EMPTY = new Uint8Array()\n\n/**\n * Encoders for chain-specific signed extensions that `@polkadot-api/tx-utils` doesn't know about.\n */\nexport const CUSTOM_SIGNED_EXTENSIONS: CustomExtensionMappers = {\n // Avail app-id; wallet-built payloads default it to 0 (see getSignerPayloadJSON)\n CheckAppId: ({ pjsPayload }) => {\n const appId = Number((pjsPayload as { appId?: unknown }).appId ?? 0)\n return {\n value: compactNumber.enc(Number.isFinite(appId) ? appId : 0),\n additionalSigned: EMPTY,\n }\n },\n}\n","import { toHex } from \"@polkadot-api/utils\"\nimport { u32, Vector } from \"scale-ts\"\n\nconst MAGIC_NUMBER = 1635018093\n\n// it's important to set a max because some chains also return high invalid version numbers in the metadata_versions list (ex on Polkadot, related to JAM?)\nexport const MAX_SUPPORTED_METADATA_VERSION = 15 // v16 sometimes outputs different metadata hashes, ignore v16 until that is fixed in PAPI\n\ntype RpcSendFunc = <T>(method: string, params: unknown[], isCacheable?: boolean) => Promise<T>\n\n/**\n * Fetches the highest supported version of metadata from the chain.\n *\n * @param rpcSend\n * @returns hex-encoded metadata starting with the magic number\n */\nexport const fetchBestMetadata = async (\n rpcSend: RpcSendFunc,\n allowLegacyFallback?: boolean\n): Promise<`0x${string}`> => {\n try {\n // fetch available versions of metadata\n const metadataVersions = await rpcSend<string>(\n \"state_call\",\n [\"Metadata_metadata_versions\", \"0x\"],\n true\n )\n const availableVersions = Vector(u32).dec(metadataVersions)\n const bestVersion = Math.max(\n ...availableVersions.filter((v) => v <= MAX_SUPPORTED_METADATA_VERSION)\n )\n\n const metadata = await rpcSend<`0x${string}`>(\n \"state_call\",\n [\"Metadata_metadata_at_version\", toHex(u32.enc(bestVersion))],\n true\n )\n\n return normalizeMetadata(metadata)\n } catch (cause) {\n // if the chain doesnt support the Metadata pallet, fallback to legacy rpc provided metadata (V14)\n const message = (cause as { message?: string })?.message\n if (\n allowLegacyFallback ||\n message?.includes(\"is not found\") || // ex: crust standalone\n message?.includes(\"Module doesn't have export Metadata_metadata_versions\") || // ex: 3DPass\n message?.includes(\"Exported method Metadata_metadata_versions is not found\") || // ex: sora-polkadot & sora-standalone\n message?.includes(\"Execution, MethodNotFound, Metadata_metadata_versions\") // ex: stafi\n ) {\n return (await rpcSend(\"state_getMetadata\", [], true)) as `0x${string}`\n }\n\n // otherwise throw so it can be handled by the caller\n throw new Error(\"Failed to fetch metadata\", { cause })\n }\n}\n\n/**\n * Removes everything before the magic number in the metadata.\n * This ensures Opaque metadata is usable by pjs\n */\nconst normalizeMetadata = (metadata: `0x${string}`): `0x${string}` => {\n const hexMagicNumber = toHex(u32.enc(MAGIC_NUMBER)).slice(2)\n\n const magicNumberIndex = metadata.indexOf(hexMagicNumber)\n if (magicNumberIndex === -1) throw new Error(\"Invalid metadata format: magic number not found\")\n\n return `0x${metadata.slice(magicNumberIndex)}` as `0x${string}`\n}\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getPayloadWithMetadataHash = (\n chain: Chain,\n chainInfo: ChainInfo,\n payload: SignerPayloadJSON\n): { payload: SignerPayloadJSON; txMetadata?: Uint8Array } => {\n if (!chain.hasCheckMetadataHash || !payload.signedExtensions.includes(\"CheckMetadataHash\"))\n return {\n payload,\n txMetadata: undefined,\n }\n\n try {\n const { decimals, symbol: tokenSymbol } = chain.token\n const { base58Prefix, specName, specVersion } = chainInfo\n const metadataHashInputs = { tokenSymbol, decimals, base58Prefix, specName, specVersion }\n\n // since ultimately this needs a V15 object, would be nice if this accepted one directly as input\n const merkleizedMetadata = merkleizeMetadata(chain.hexMetadata, metadataHashInputs)\n const metadataHash = toHex(merkleizedMetadata.digest()) as `0x${string}`\n log.log(\"metadataHash\", metadataHash, metadataHashInputs)\n\n const payloadWithMetadataHash = {\n ...payload,\n mode: 1,\n metadataHash,\n withSignedTransaction: true,\n }\n\n const { callData, extra, additionalSigned } = getPjsTxHelper(\n chain.hexMetadata,\n CUSTOM_SIGNED_EXTENSIONS\n )(payloadWithMetadataHash)\n const barePayload = mergeUint8([callData, extra, additionalSigned])\n\n const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(barePayload)\n\n return {\n payload: payloadWithMetadataHash,\n txMetadata,\n }\n } catch (err) {\n log.error(\"Failed to get shortened metadata\", { error: err })\n return {\n payload,\n txMetadata: undefined,\n }\n }\n}\n","import type { Chain } from \"./types\"\n\nexport const getSendRequestResult = <Res>(\n chain: Chain,\n method: string,\n params: unknown[],\n isCacheable?: boolean\n): Promise<Res> => {\n return chain.connector.send(method, params, isCacheable) as Promise<Res>\n}\n","import { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getStorageValue = async <T>(\n chain: Chain,\n pallet: string,\n entry: string,\n keys: unknown[],\n at?: string\n) => {\n const storageCodec = chain.builder.buildStorage(pallet, entry)\n const stateKey = storageCodec.keys.enc(...keys)\n\n const hexValue = await getSendRequestResult<string | null>(chain, \"state_getStorage\", [\n stateKey,\n at,\n ])\n if (!hexValue) return null as T // caller will need to expect null when applicable\n\n return storageCodec.value.dec(hexValue) as T\n}\n","import { Bytes, enhanceEncoder, getSs58AddressInfo, u16 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////// Utilities from PAPI /////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const toPjsHex = (value: number | bigint, minByteLen?: number) => {\n let inner = value.toString(16)\n inner = (inner.length % 2 ? \"0\" : \"\") + inner\n const nPaddedBytes = Math.max(0, (minByteLen || 0) - inner.length / 2)\n return `0x${\"00\".repeat(nPaddedBytes)}${inner}` as `0x${string}`\n}\n\nexport const mortal = enhanceEncoder(Bytes(2).enc, (value: { period: number; phase: number }) => {\n const factor = Math.max(value.period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15)\n const right = (value.phase / factor) << 4\n return u16.enc(left | right)\n})\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nexport const isEthereumAddress = (address: string) => /^0x[0-9a-fA-F]{40}$/.test(address)\n\n/** decodes an ss58 or ethereum address into its raw account bytes */\nexport const getAddressBytes = (address: string): Uint8Array => {\n if (isEthereumAddress(address)) return fromHex(address)\n const info = getSs58AddressInfo(address)\n if (!info.isValid) throw new Error(`Invalid address: ${address}`)\n return info.publicKey\n}\n","import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { PayloadSignerConfig } from \"../types\"\nimport { getPayloadWithMetadataHash } from \"./getPayloadWithMetadataHash\"\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport { getStorageValue } from \"./getStorageValue\"\nimport { mortal, toPjsHex } from \"./papi\"\nimport type { Chain, ChainInfo } from \"./types\"\n\n/** validity period of a signed payload in blocks: the mortal era every payload is built with */\nexport const ERA_PERIOD = 64\n\nexport const getSignerPayloadJSON = async (\n chain: Chain,\n palletName: string,\n methodName: string,\n args: unknown,\n signerConfig: PayloadSignerConfig,\n chainInfo: ChainInfo\n): Promise<{\n payload: SignerPayloadJSON\n txMetadata: Uint8Array | undefined\n shortMetadata: `0x${string}` | undefined\n}> => {\n const { codec, location } = chain.builder.buildCall(palletName, methodName)\n const method = mergeUint8([new Uint8Array(location), codec.enc(args)])\n\n // on unstable networks with lots of forks (ex: westend asset hub as of june 2025),\n // using a finalized block as reference for mortality is necessary for txs to get through\n let blockHash = await getSendRequestResult<`0x${string}`>(\n chain,\n \"chain_getFinalizedHead\",\n [],\n false\n )\n\n const [nonce, genesisHash, blockNumberFinalized, blockNumberCurrent] = await Promise.all([\n getSendRequestResult<number>(chain, \"system_accountNextIndex\", [signerConfig.address], false),\n getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [0]),\n getStorageValue<number>(chain, \"System\", \"Number\", [], blockHash),\n getStorageValue<number>(chain, \"System\", \"Number\", []),\n ])\n if (!genesisHash) throw new Error(\"Genesis hash not found\")\n if (!blockHash) throw new Error(\"Block hash not found\")\n\n let blockNumber = blockNumberFinalized\n\n // on Autonomys the finalized block hash is wrong (7000 blocks behind),\n // if we use it to craft a tx it will be invalid\n // => if finalized block number is more than 32 blocks behind, use current - 16\n if (blockNumberCurrent - blockNumberFinalized > 32) {\n blockNumber = blockNumberCurrent - 16\n\n const binBlockHash = await getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [\n blockNumber,\n ])\n blockHash = binBlockHash\n }\n\n const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD })\n // signedExtensions is keyed by extension version, 0 is the default\n const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(\n (ext) => ext.identifier\n )\n\n const basePayload: SignerPayloadJSON = {\n address: signerConfig.address,\n genesisHash,\n blockHash,\n method: Binary.toHex(method),\n signedExtensions,\n nonce: toPjsHex(nonce, 4),\n specVersion: toPjsHex(chainInfo.specVersion, 4),\n transactionVersion: toPjsHex(chainInfo.transactionVersion, 4),\n blockNumber: toPjsHex(blockNumber, 4),\n era: toHex(era) as `0x${string}`,\n tip: toPjsHex(0, 16), // TODO gas station (required for Astar)\n assetId: undefined,\n version: 4,\n }\n\n const { payload, txMetadata } = getPayloadWithMetadataHash(chain, chainInfo, basePayload)\n const shortMetadata = txMetadata ? (toHex(txMetadata) as `0x${string}`) : undefined\n\n // Avail support\n if (payload.signedExtensions.includes(\"CheckAppId\"))\n (payload as SignerPayloadJSON & { appId: number }).appId = 0\n\n log.log(\"[sapi] payload\", { newPayload: payload, txMetadata })\n\n return {\n payload,\n txMetadata, // TODO remove\n shortMetadata,\n }\n}\n","import log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getCallDocs = (chain: Chain, pallet: string, method: string): string | null => {\n try {\n const typeIdCalls = chain.metadata.pallets.find(({ name }) => name === pallet)?.calls?.type\n if (!typeIdCalls) return null\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let palletCalls: any = chain.metadata.lookup[typeIdCalls]\n if (!palletCalls || palletCalls.id !== typeIdCalls)\n palletCalls = chain.metadata.lookup.find((v) => v.id === typeIdCalls)\n\n if (!palletCalls) return null\n\n const call = palletCalls.def.value.find(\n (c: { name: string; docs?: string[] | null }) => c.name === method\n )\n\n return call?.docs?.join(\"\\n\") ?? null\n } catch {\n log.error(\"Failed to find call docs\", { pallet, method, chain })\n return null\n }\n}\n","import { getConstantValueFromMetadata } from \"@talismn/scale\"\n\nimport type { Chain } from \"./types\"\n\nexport const getConstantValue = <T>(chain: Chain, pallet: string, constant: string) => {\n return getConstantValueFromMetadata<T>(\n {\n builder: chain.builder,\n unifiedMetadata: chain.metadata,\n },\n pallet,\n constant\n )\n}\n","import { getConstantValue } from \"./getConstantValue\"\nimport type { Chain } from \"./types\"\n\ntype SystemVersion = {\n spec_name: string\n spec_version: number\n transaction_version: number\n}\n\nexport const getChainInfo = (chain: Chain) => {\n const {\n spec_name: specName,\n spec_version: specVersion,\n transaction_version: transactionVersion,\n } = getConstantValue<SystemVersion>(chain, \"System\", \"Version\")\n\n const base58Prefix = getConstantValue<number>(chain, \"System\", \"SS58Prefix\")\n\n return {\n specName,\n specVersion,\n transactionVersion,\n base58Prefix,\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const getDecodedCall = (palletName: string, methodName: string, args: unknown) => ({\n type: palletName,\n value: { type: methodName, value: args },\n})\n\nexport const getDecodedCallFromPayload = <Res extends DecodedCall>(\n chain: Chain,\n payload: { method: SignerPayloadJSON[\"method\"] }\n): Res => {\n const def = chain.builder.buildDefinition(chain.lookup.call!)\n const decoded = def.dec(payload.method)\n\n return {\n pallet: decoded.type,\n method: decoded.value.type,\n args: decoded.value.value,\n } as Res\n}\n","import {\n Bytes,\n compactNumber,\n createDecoder,\n type Decoder,\n enhanceDecoder,\n extrinsicFormat,\n type StringRecord,\n Struct,\n u8,\n} from \"@polkadot-api/substrate-bindings\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nconst allBytesDec = Bytes(Infinity).dec\n\n/**\n * Decodes a signed extrinsic and extracts the call data.\n * Handles different metadata versions (v14, v15, v16) and extrinsic formats.\n *\n * @param chain - The chain context with metadata and builder\n * @param extrinsicHex - The hex-encoded extrinsic (with 0x prefix)\n * @returns The decoded call with pallet, method, and args, or null if decoding fails\n */\nexport const getDecodedCallFromExtrinsic = <Res extends DecodedCall>(\n chain: Chain,\n extrinsicHex: `0x${string}`\n): Res | null => {\n try {\n const { metadata, builder } = chain\n\n // Build decoder for signed extensions (extra field)\n // signedExtensions is keyed by extension version, 0 is the default\n const extensionsArray = metadata.extrinsic.signedExtensions[0] ?? []\n const extraDec = Struct.dec(\n Object.fromEntries(\n extensionsArray.map((x) => [x.identifier, builder.buildDefinition(x.type)[1]])\n ) as StringRecord<Decoder<unknown>>\n )\n\n // Build call decoder\n let callDec: Decoder<{ type: string; value: { type: string; value: unknown } }>\n const { extrinsic } = metadata\n if (\"address\" in extrinsic) {\n // v15/v16 metadata\n callDec = builder.buildDefinition(extrinsic.call)[1]\n } else {\n // v14 metadata\n const params = metadata.lookup[extrinsic.type]?.params\n const callType = params?.find((v) => v.name === \"Call\")?.type\n if (callType == null) throw new Error(\"Call type not found in metadata\")\n callDec = builder.buildDefinition(callType)[1]\n }\n\n // Build address and signature decoders\n let addressDec: Decoder<unknown>\n let signatureDec: Decoder<unknown>\n if (\"address\" in extrinsic) {\n // v15/v16\n addressDec = builder.buildDefinition(extrinsic.address)[1]\n signatureDec = builder.buildDefinition(extrinsic.signature)[1]\n } else {\n // v14\n const params = metadata.lookup[extrinsic.type]?.params\n const addrType = params?.find((v) => v.name === \"Address\")?.type\n const sigType = params?.find((v) => v.name === \"Signature\")?.type\n if (addrType == null || sigType == null)\n throw new Error(\"Address or Signature type not found\")\n addressDec = builder.buildDefinition(addrType)[1]\n signatureDec = builder.buildDefinition(sigType)[1]\n }\n\n // Build full signed extrinsic body decoder\n const v4Body = Struct.dec({\n address: addressDec,\n signature: signatureDec,\n extra: extraDec,\n callData: allBytesDec,\n })\n\n // Create the full extrinsic decoder\n const extrinsicDecoder = enhanceDecoder(\n createDecoder((data) => {\n const len = compactNumber.dec(data)\n const { type, version } = extrinsicFormat[1](data)\n\n if (type === \"bare\") {\n return { len, version, type, callData: allBytesDec(data) }\n }\n if (type === \"signed\") {\n return { len, version, type, ...v4Body(data) }\n }\n\n // v5 general format\n const extensionVersion = u8.dec(data)\n const extra = extraDec(data)\n return {\n len,\n type,\n version,\n extensionVersion,\n extra,\n callData: allBytesDec(data),\n }\n }),\n (v) => ({\n ...v,\n call: callDec(v.callData),\n })\n )\n\n // Decode the extrinsic\n const decoded = extrinsicDecoder(extrinsicHex)\n\n return {\n pallet: decoded.call.type,\n method: decoded.call.value.type,\n args: decoded.call.value.value,\n } as Res\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: troubleshoting\n console.error(\"[SAPI] Failed to decode extrinsic:\", err)\n return null\n }\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getDispatchErrorMessage = (chain: Chain, err: unknown): string | null => {\n try {\n if (!err) return null\n\n const error = err as UnsafeDispatchError\n if (!error.type) throw new Error(\"Unknown dispatch error\")\n\n const lv1 = DISPATCH_ERROR[error.type as keyof typeof DISPATCH_ERROR]\n if (!lv1) throw new Error(\"Unknown dispatch error\")\n if (lv1 === ERROR_METADATA_LOOKUP)\n return getModuleErrorMessage(chain, error.value as UnsafeModuleError)\n if (typeof lv1 === \"string\") return lv1\n\n const lv2 = lv1[error.value?.type as keyof typeof lv1]\n if (!lv2) throw new Error(\"Unknown dispatch error\")\n if (typeof lv2 === \"string\") return lv2\n\n throw new Error(\"Unknown dispatch error\")\n } catch (cause) {\n log.error(\"Failed to parse runtime error\", { chainId: chain.connector.chainId, cause, err })\n return tryFormatError(err)\n }\n}\n\nconst ERROR_METADATA_LOOKUP = \"METADATA_LOOKUP\"\n\n// only `Module` errors are part of the metadata\n// errors below are defined as part of the runtime but their docs aren't included in the metadata\n// so those are copy/pasted from the polkadot-sdk repo\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L543\nconst ERRORS_TRANSACTIONAL = {\n LimitReached: \"Too many transactional layers have been spawned\",\n NoLayer: \"A transactional layer was expected, but does not exist\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L672\nconst ERRORS_TOKEN = {\n FundsUnavailable: \"Funds are unavailable\",\n OnlyProvider: \"Account that must exist would die\",\n BelowMinimum: \"Account cannot exist with the funds that would be given\",\n CannotCreate: \"Account cannot be created\",\n UnknownAsset: \"The asset in question is unknown\",\n Frozen: \"Funds exist but are frozen\",\n Unsupported: \"Operation is not supported by the asset\",\n CannotCreateHold: \"Account cannot be created for recording amount on hold\",\n NotExpendable: \"Account that is desired to remain would die\",\n Blocked: \"Account cannot receive the assets\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/arithmetic/src/lib.rs#L76\nconst ERRORS_ARITHMETIC = {\n Overflow: \"An underflow would occur\",\n Underflow: \"An overflow would occur\",\n DivisionByZero: \"Division by zero\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L714\nconst DISPATCH_ERROR = {\n CannotLookup: \"Cannot lookup\",\n BadOrigin: \"Bad origin\",\n Module: ERROR_METADATA_LOOKUP,\n ConsumerRemaining: \"Consumer remaining\",\n NoProviders: \"No providers\",\n TooManyConsumers: \"Too many consumers\",\n Token: ERRORS_TOKEN,\n Arithmetic: ERRORS_ARITHMETIC,\n Transactional: ERRORS_TRANSACTIONAL,\n Exhausted: \"Resources exhausted\",\n Corruption: \"State corrupt\",\n Unavailable: \"Resource unavailable\",\n RootNotAllowed: \"Root not allowed\",\n Trie: \"Unknown error\", // unsupported,\n Other: \"Unknown error\", // unsupported,\n}\n\ntype UnsafeDispatchError = {\n type: string\n value:\n | {\n type: string\n value:\n | {\n type: string\n value: undefined\n }\n | undefined\n }\n | undefined\n}\n\ntype UnsafeModuleError = {\n type: string\n value: {\n type: string\n value: undefined\n }\n}\n\nconst getModuleErrorMessage = (chain: Chain, error: UnsafeModuleError): string => {\n try {\n if (!chain.metadata) throw new Error(\"Could not fetch metadata\")\n\n const pallet = chain.metadata.pallets.find((p) => p.name === error.type)\n if (typeof pallet?.errors !== \"number\") throw new Error(\"Unknown pallet\")\n\n const lookup = getLookupFn(chain.metadata)\n\n const palletErrors = lookup(pallet.errors)\n if (palletErrors.type !== \"enum\" || !palletErrors.innerDocs[error.value.type]?.length)\n throw new Error(\"Unknown error type\")\n\n return palletErrors.innerDocs[error.value.type].join(\" \")\n } catch (err) {\n log.error(\"Failed to parse module error\", { chainId: chain.connector.chainId, error, err })\n return [error.type, error.value.type].join(\": \")\n }\n}\n\nconst tryFormatError = (err: unknown): string => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const unsafeErr = err as any\n if (unsafeErr.type && unsafeErr.value?.type)\n return [unsafeErr.type, unsafeErr.value.type].join(\": \")\n } catch {\n // ignore\n }\n\n return \"Unknown error\"\n}\n","import { toHex } from \"@polkadot-api/utils\"\n\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getRuntimeCallResult = async <T>(\n chain: Chain,\n apiName: string,\n method: string,\n args: unknown[]\n) => {\n const call = chain.builder.buildRuntimeCall(apiName, method)\n\n const hex = await getSendRequestResult<string>(chain, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n}\n","import type { Chain } from \"./types\"\n\nexport const isApiAvailable = (chain: Chain, name: string, method: string) => {\n return chain.metadata.apis.some(\n (a) => a.name === name && a.methods.some((m) => m.name === method)\n )\n}\n","import type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"@polkadot-api/substrate-bindings\"\n\nimport log from \"../log\"\nimport type { DecodedCall } from \"../types\"\nimport { getDispatchErrorMessage } from \"./errors\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { isApiAvailable } from \"./isApiAvailable\"\nimport type { Chain } from \"./types\"\n\ntype DryRunResult = (\n | typeof polkadot\n | typeof polkadotAssetHub\n)[\"descriptors\"][\"apis\"][\"DryRunApi\"][\"dry_run_call\"][1]\n\nexport const getDryRunCall = async <T>(\n chain: Chain,\n from: string,\n decodedCall: DecodedCall<unknown>\n): Promise<\n | {\n available: boolean\n data: null\n ok?: undefined\n errorMessage?: undefined\n }\n | {\n available: boolean\n data: T\n ok: boolean\n errorMessage: string | null\n }\n> => {\n try {\n if (!isApiAvailable(chain, \"DryRunApi\", \"dry_run_call\"))\n return {\n available: false,\n data: null,\n }\n\n const origin = Enum(\"system\", Enum(\"Signed\", from))\n\n const { pallet, method, args } = decodedCall\n const call = { type: pallet, value: { type: method, value: args } }\n\n // This will throw an error if the api is not available on that chain\n const data = await getRuntimeCallResult<DryRunResult>(chain, \"DryRunApi\", \"dry_run_call\", [\n origin,\n call,\n ])\n\n const ok = data.success && data.value.execution_result.success\n const errorMessage =\n data.success && !data.value.execution_result.success\n ? getDispatchErrorMessage(chain, data.value.execution_result.value.error)\n : null\n\n return {\n available: true,\n // NOTE: we can't re-export `@polkadot-api/descriptors` from this package.\n // So, the caller of this function must pass in their own instance of `type DryRunResult` as the generic argument `T`.\n data: data as T,\n ok,\n errorMessage,\n }\n } catch (err) {\n // Note : err is null if chain doesnt have the api\n log.error(\"Failed to dry run\", { chainId: chain.connector.chainId, err })\n return {\n available: false,\n data: null,\n }\n }\n}\n","import { u32, u128 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\n\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// fee estimation fallback for chains that dont have metadata v15 yet\n// (the runtime-call codecs needed to decode this with the dynamic builder require metadata v15)\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n // the full encoded extrinsic, INCLUDING its compact length prefix: the runtime\n // decodes the uxt argument as an opaque length-prefixed UncheckedExtrinsic\n signedTxBytes: Uint8Array\n): Promise<ExtrinsicDispatchInfo> => {\n const args = mergeUint8([signedTxBytes, u32.enc(signedTxBytes.length)])\n\n const result = (await chain.connector.send(\n \"state_call\",\n [\"TransactionPaymentApi_query_info\", toHex(args)],\n true\n )) as `0x${string}`\n\n // RuntimeDispatchInfo = { weight: WeightV1 (u64) | WeightV2 (2x compact), class: enum (1 byte), partial_fee: u128 }\n // the weight shape varies across old runtimes, but partial_fee is always the trailing fixed-size field\n const bytes = fromHex(result)\n if (bytes.length < 16) throw new Error(\"Invalid RuntimeDispatchInfo\")\n // .slice (copy), NOT .subarray: papi codecs read offset views from the buffer start\n const partialFee = u128.dec(bytes.slice(bytes.length - 16))\n\n return {\n partialFee: partialFee.toString(),\n }\n}\n","import { createV4Tx } from \"@polkadot-api/signers-common\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getAddressBytes, isEthereumAddress } from \"./papi\"\nimport type { Chain } from \"./types\"\n\n/** strips the leading compact length prefix from an encoded extrinsic */\nconst stripLengthPrefix = (tx: Uint8Array): Uint8Array => {\n const mode = tx[0] & 3\n const prefixLen = mode === 0 ? 1 : mode === 1 ? 2 : mode === 2 ? 4 : 1 + (tx[0] >> 2) + 4\n return tx.subarray(prefixLen)\n}\n\nexport const getFeeEstimate = async (chain: Chain, payload: SignerPayloadJSON) => {\n // build a fake-signed extrinsic - fees depend on the encoded length, not the signature content\n const { callData, extra } = getPjsTxHelper(chain.hexMetadata, CUSTOM_SIGNED_EXTENSIONS)(payload)\n const fakeSignature = isEthereumAddress(payload.address)\n ? new Uint8Array(65) // AccountId20 chains: raw 65-byte signature, no MultiSignature prefix\n : new Uint8Array(66).fill(2, 0, 1) // MultiSignature ecdsa variant, the longest (type byte + 65) so the length fee is never underestimated\n\n const signedTx = createV4Tx(\n chain.metadata,\n getAddressBytes(payload.address),\n fakeSignature,\n [extra],\n callData\n )\n\n const bytes = stripLengthPrefix(signedTx)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [bytes, bytes.length]\n )\n // Do not throw if partialFee is 0n. This is a valid response, eg: Bittensor remove_stake fee estimation is 0n.\n if (!result?.partial_fee && result.partial_fee !== 0n) {\n throw new Error(\"partialFee is not found\")\n }\n return result.partial_fee\n } catch (err) {\n log.error(\"Failed to get fee estimate using getRuntimeCallValue\", { err })\n }\n\n // fallback to pjs encoded state call, in case the above fails (extracting runtime calls codecs might require metadata V15)\n // Note: PAPI will consider TransactionPaymentApi as first class api so it should work even without V15, but this is not the case yet.\n const { partialFee } = await getExtrinsicDispatchInfo(chain, signedTx)\n\n return BigInt(partialFee)\n}\n","import type { SapiConnectorProps } from \"../types\"\n\nexport type SapiConnector = Required<SapiConnectorProps>\n\nexport const getSapiConnector = ({\n chainId,\n send,\n submit,\n submitWithBittensorMevShield,\n}: SapiConnectorProps): SapiConnector => ({\n chainId,\n send,\n submit: (...args) => {\n if (submit) return submit(...args)\n throw new Error(\"submit handler not provided\")\n },\n submitWithBittensorMevShield: (...args) => {\n if (submitWithBittensorMevShield) return submitWithBittensorMevShield(...args)\n throw new Error(\"submitWithBittensorMevShield handler not provided\")\n },\n})\n","import type { Chain } from \"./types\"\n\nexport const hasConstant = (chain: Chain, pallet: string, constant: string): boolean => {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n return !!palletDef?.constants.some((c) => c.name === constant)\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const hasEvent = (chain: Chain, pallet: string, event: string): boolean => {\n try {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n if (typeof palletDef?.events !== \"number\") return false\n\n const lookup = getLookupFn(chain.metadata)\n const palletEvents = lookup(palletDef.events)\n\n return palletEvents.type === \"enum\" && event in palletEvents.innerDocs\n } catch (err) {\n log.error(\"Failed to check event existence\", { pallet, event, err })\n return false\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { ScaleApiSubmitMode } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const submit = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n): Promise<{ hash: `0x${string}`; innerHash?: `0x${string}` }> => {\n switch (mode) {\n case \"bittensor-mev-shield\":\n if (signature)\n throw new Error(\"Signature should not be provided when using bittensor-mev-shield mode\")\n return chain.connector.submitWithBittensorMevShield(payload, txInfo)\n\n default:\n return chain.connector.submit(payload, signature, txInfo)\n }\n}\n","import { parseMetadataRpc } from \"@talismn/scale\"\nimport { getCallDocs } from \"./helpers/getCallDocs\"\nimport { getChainInfo } from \"./helpers/getChainInfo\"\nimport { getConstantValue } from \"./helpers/getConstantValue\"\nimport { getDecodedCall, getDecodedCallFromPayload } from \"./helpers/getDecodedCall\"\nimport { getDecodedCallFromExtrinsic } from \"./helpers/getDecodedCallFromExtrinsic\"\nimport { getDryRunCall } from \"./helpers/getDryRunCall\"\nimport { getFeeEstimate } from \"./helpers/getFeeEstimate\"\nimport { getRuntimeCallResult } from \"./helpers/getRuntimeCallResult\"\nimport { getSapiConnector } from \"./helpers/getSapiConnector\"\nimport { getSignerPayloadJSON } from \"./helpers/getSignerPayloadJSON\"\nimport { getStorageValue } from \"./helpers/getStorageValue\"\nimport { hasConstant } from \"./helpers/hasConstant\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\nimport type { ExtDef, SignerPayloadJSON } from \"./pjsInterop\"\nimport type {\n DecodedCall,\n PayloadSignerConfig,\n SapiConnectorProps,\n ScaleApiSubmitMode,\n} from \"./types\"\n\nexport type ScaleApi = NonNullable<ReturnType<typeof getScaleApi>>\n\nexport const getScaleApi = (\n connector: SapiConnectorProps,\n hexMetadata: `0x${string}`,\n token: { symbol: string; decimals: number },\n hasCheckMetadataHash?: boolean,\n signedExtensions?: ExtDef,\n registryTypes?: unknown\n) => {\n const { unifiedMetadata: metadata, lookupFn: lookup, builder } = parseMetadataRpc(hexMetadata)\n\n const chain: Chain = {\n connector: getSapiConnector(connector),\n hexMetadata,\n\n token,\n hasCheckMetadataHash,\n signedExtensions,\n registryTypes,\n\n metadata,\n lookup,\n builder,\n metadataRpc: hexMetadata,\n }\n\n const chainInfo = getChainInfo(chain)\n\n const { specName, specVersion, base58Prefix } = chainInfo\n\n return {\n id: `${connector.chainId}::${specName}::${specVersion}`,\n chainId: connector.chainId,\n specName,\n specVersion,\n hasCheckMetadataHash,\n base58Prefix,\n token: chain.token,\n chain,\n\n getConstant: <T>(pallet: string, constant: string) =>\n getConstantValue<T>(chain, pallet, constant),\n\n getStorage: <T>(pallet: string, entry: string, keys: unknown[], at?: string) =>\n getStorageValue<T>(chain, pallet, entry, keys, at),\n\n getDecodedCall: (pallet: string, method: string, args: unknown) =>\n getDecodedCall(pallet, method, args),\n\n getDecodedCallFromPayload: <Res extends DecodedCall>(payload: {\n method: SignerPayloadJSON[\"method\"]\n }) => getDecodedCallFromPayload<Res>(chain, payload),\n\n getDecodedCallFromExtrinsic: <Res extends DecodedCall>(extrinsicHex: `0x${string}`) =>\n getDecodedCallFromExtrinsic<Res>(chain, extrinsicHex),\n\n getExtrinsicPayload: (\n pallet: string,\n method: string,\n args: unknown,\n config: PayloadSignerConfig\n ) => getSignerPayloadJSON(chain, pallet, method, args, config, chainInfo),\n\n getFeeEstimate: (payload: SignerPayloadJSON) => getFeeEstimate(chain, payload),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n submit: (\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n ) => submit(chain, payload, signature, txInfo, mode),\n\n getCallDocs: (pallet: string, method: string) => getCallDocs(chain, pallet, method),\n\n getDryRunCall: <T>(from: string, decodedCall: DecodedCall<unknown>) =>\n getDryRunCall<T>(chain, from, decodedCall),\n\n isApiAvailable: (name: string, method: string) => isApiAvailable(chain, name, method),\n\n hasEvent: (pallet: string, event: string) => hasEvent(chain, pallet, event),\n\n hasConstant: (pallet: string, constant: string) => hasConstant(chain, pallet, constant),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["compactNumber","Vector","u32","toHex","packageJson.name","merkleizeMetadata","toHex","getPjsTxHelper","mergeUint8","enhanceEncoder","Bytes","u16","fromHex","getSs58AddressInfo","mergeUint8","Binary","toHex","getConstantValueFromMetadata","Bytes","Struct","enhanceDecoder","createDecoder","compactNumber","extrinsicFormat","u8","getLookupFn","toHex","Enum","mergeUint8","u32","toHex","fromHex","u128","getPjsTxHelper","createV4Tx","getLookupFn","parseMetadataRpc"],"sources":["../src/customSignedExtensions.ts","../src/fetchBestMetadata.ts","../package.json","../src/log.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getDryRunCall.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/hasConstant.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts","../src/sapi.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport type { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\n\ntype CustomExtensionMappers = NonNullable<Parameters<typeof getPjsTxHelper>[1]>\n\nconst EMPTY = new Uint8Array()\n\n/**\n * Encoders for chain-specific signed extensions that `@polkadot-api/tx-utils` doesn't know about.\n */\nexport const CUSTOM_SIGNED_EXTENSIONS: CustomExtensionMappers = {\n // Avail app-id; wallet-built payloads default it to 0 (see getSignerPayloadJSON)\n CheckAppId: ({ pjsPayload }) => {\n const appId = Number((pjsPayload as { appId?: unknown }).appId ?? 0)\n return {\n value: compactNumber.enc(Number.isFinite(appId) ? appId : 0),\n additionalSigned: EMPTY,\n }\n },\n}\n","import { toHex } from \"@polkadot-api/utils\"\nimport { u32, Vector } from \"scale-ts\"\n\nconst MAGIC_NUMBER = 1635018093\n\n// it's important to set a max because some chains also return high invalid version numbers in the metadata_versions list (ex on Polkadot, related to JAM?)\nexport const MAX_SUPPORTED_METADATA_VERSION = 15 // v16 sometimes outputs different metadata hashes, ignore v16 until that is fixed in PAPI\n\ntype RpcSendFunc = <T>(method: string, params: unknown[], isCacheable?: boolean) => Promise<T>\n\n/**\n * Fetches the highest supported version of metadata from the chain.\n *\n * @param rpcSend\n * @returns hex-encoded metadata starting with the magic number\n */\nexport const fetchBestMetadata = async (\n rpcSend: RpcSendFunc,\n allowLegacyFallback?: boolean\n): Promise<`0x${string}`> => {\n try {\n // fetch available versions of metadata\n const metadataVersions = await rpcSend<string>(\n \"state_call\",\n [\"Metadata_metadata_versions\", \"0x\"],\n true\n )\n const availableVersions = Vector(u32).dec(metadataVersions)\n const bestVersion = Math.max(\n ...availableVersions.filter((v) => v <= MAX_SUPPORTED_METADATA_VERSION)\n )\n\n const metadata = await rpcSend<`0x${string}`>(\n \"state_call\",\n [\"Metadata_metadata_at_version\", toHex(u32.enc(bestVersion))],\n true\n )\n\n return normalizeMetadata(metadata)\n } catch (cause) {\n // if the chain doesnt support the Metadata pallet, fallback to legacy rpc provided metadata (V14)\n const message = (cause as { message?: string })?.message\n if (\n allowLegacyFallback ||\n message?.includes(\"is not found\") || // ex: crust standalone\n message?.includes(\"Module doesn't have export Metadata_metadata_versions\") || // ex: 3DPass\n message?.includes(\"Exported method Metadata_metadata_versions is not found\") || // ex: sora-polkadot & sora-standalone\n message?.includes(\"Execution, MethodNotFound, Metadata_metadata_versions\") // ex: stafi\n ) {\n return (await rpcSend(\"state_getMetadata\", [], true)) as `0x${string}`\n }\n\n // otherwise throw so it can be handled by the caller\n throw new Error(\"Failed to fetch metadata\", { cause })\n }\n}\n\n/**\n * Removes everything before the magic number in the metadata.\n * This ensures Opaque metadata is usable by pjs\n */\nconst normalizeMetadata = (metadata: `0x${string}`): `0x${string}` => {\n const hexMagicNumber = toHex(u32.enc(MAGIC_NUMBER)).slice(2)\n\n const magicNumberIndex = metadata.indexOf(hexMagicNumber)\n if (magicNumberIndex === -1) throw new Error(\"Invalid metadata format: magic number not found\")\n\n return `0x${metadata.slice(magicNumberIndex)}` as `0x${string}`\n}\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getPayloadWithMetadataHash = (\n chain: Chain,\n chainInfo: ChainInfo,\n payload: SignerPayloadJSON\n): { payload: SignerPayloadJSON; txMetadata?: Uint8Array } => {\n if (!chain.hasCheckMetadataHash || !payload.signedExtensions.includes(\"CheckMetadataHash\"))\n return {\n payload,\n txMetadata: undefined,\n }\n\n try {\n const { decimals, symbol: tokenSymbol } = chain.token\n const { base58Prefix, specName, specVersion } = chainInfo\n const metadataHashInputs = { tokenSymbol, decimals, base58Prefix, specName, specVersion }\n\n // since ultimately this needs a V15 object, would be nice if this accepted one directly as input\n const merkleizedMetadata = merkleizeMetadata(chain.hexMetadata, metadataHashInputs)\n const metadataHash = toHex(merkleizedMetadata.digest()) as `0x${string}`\n log.log(\"metadataHash\", metadataHash, metadataHashInputs)\n\n const payloadWithMetadataHash = {\n ...payload,\n mode: 1,\n metadataHash,\n withSignedTransaction: true,\n }\n\n const { callData, extra, additionalSigned } = getPjsTxHelper(\n chain.hexMetadata,\n CUSTOM_SIGNED_EXTENSIONS\n )(payloadWithMetadataHash)\n const barePayload = mergeUint8([callData, extra, additionalSigned])\n\n const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(barePayload)\n\n return {\n payload: payloadWithMetadataHash,\n txMetadata,\n }\n } catch (err) {\n log.error(\"Failed to get shortened metadata\", { error: err })\n return {\n payload,\n txMetadata: undefined,\n }\n }\n}\n","import type { Chain } from \"./types\"\n\nexport const getSendRequestResult = <Res>(\n chain: Chain,\n method: string,\n params: unknown[],\n isCacheable?: boolean\n): Promise<Res> => {\n return chain.connector.send(method, params, isCacheable) as Promise<Res>\n}\n","import { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getStorageValue = async <T>(\n chain: Chain,\n pallet: string,\n entry: string,\n keys: unknown[],\n at?: string\n) => {\n const storageCodec = chain.builder.buildStorage(pallet, entry)\n const stateKey = storageCodec.keys.enc(...keys)\n\n const hexValue = await getSendRequestResult<string | null>(chain, \"state_getStorage\", [\n stateKey,\n at,\n ])\n if (!hexValue) return null as T // caller will need to expect null when applicable\n\n return storageCodec.value.dec(hexValue) as T\n}\n","import { Bytes, enhanceEncoder, getSs58AddressInfo, u16 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////// Utilities from PAPI /////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const toPjsHex = (value: number | bigint, minByteLen?: number) => {\n let inner = value.toString(16)\n inner = (inner.length % 2 ? \"0\" : \"\") + inner\n const nPaddedBytes = Math.max(0, (minByteLen || 0) - inner.length / 2)\n return `0x${\"00\".repeat(nPaddedBytes)}${inner}` as `0x${string}`\n}\n\nexport const mortal = enhanceEncoder(Bytes(2).enc, (value: { period: number; phase: number }) => {\n const factor = Math.max(value.period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15)\n const right = (value.phase / factor) << 4\n return u16.enc(left | right)\n})\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nexport const isEthereumAddress = (address: string) => /^0x[0-9a-fA-F]{40}$/.test(address)\n\n/** decodes an ss58 or ethereum address into its raw account bytes */\nexport const getAddressBytes = (address: string): Uint8Array => {\n if (isEthereumAddress(address)) return fromHex(address)\n const info = getSs58AddressInfo(address)\n if (!info.isValid) throw new Error(`Invalid address: ${address}`)\n return info.publicKey\n}\n","import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { PayloadSignerConfig } from \"../types\"\nimport { getPayloadWithMetadataHash } from \"./getPayloadWithMetadataHash\"\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport { getStorageValue } from \"./getStorageValue\"\nimport { mortal, toPjsHex } from \"./papi\"\nimport type { Chain, ChainInfo } from \"./types\"\n\n/** validity period of a signed payload in blocks: the mortal era every payload is built with */\nexport const ERA_PERIOD = 64\n\nexport const getSignerPayloadJSON = async (\n chain: Chain,\n palletName: string,\n methodName: string,\n args: unknown,\n signerConfig: PayloadSignerConfig,\n chainInfo: ChainInfo\n): Promise<{\n payload: SignerPayloadJSON\n txMetadata: Uint8Array | undefined\n shortMetadata: `0x${string}` | undefined\n}> => {\n const { codec, location } = chain.builder.buildCall(palletName, methodName)\n const method = mergeUint8([new Uint8Array(location), codec.enc(args)])\n\n // on unstable networks with lots of forks (ex: westend asset hub as of june 2025),\n // using a finalized block as reference for mortality is necessary for txs to get through\n let blockHash = await getSendRequestResult<`0x${string}`>(\n chain,\n \"chain_getFinalizedHead\",\n [],\n false\n )\n\n const [nonce, genesisHash, blockNumberFinalized, blockNumberCurrent] = await Promise.all([\n getSendRequestResult<number>(chain, \"system_accountNextIndex\", [signerConfig.address], false),\n getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [0]),\n getStorageValue<number>(chain, \"System\", \"Number\", [], blockHash),\n getStorageValue<number>(chain, \"System\", \"Number\", []),\n ])\n if (!genesisHash) throw new Error(\"Genesis hash not found\")\n\n let blockNumber = blockNumberFinalized\n\n // on Autonomys the finalized block hash is wrong (7000 blocks behind),\n // if we use it to craft a tx it will be invalid\n // => if finalized block number is more than 32 blocks behind, use current - 16\n if (blockNumberCurrent - blockNumberFinalized > 32) {\n blockNumber = blockNumberCurrent - 16\n\n const binBlockHash = await getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [\n blockNumber,\n ])\n blockHash = binBlockHash\n }\n if (!blockHash) throw new Error(\"Block hash not found\")\n\n const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD })\n // signedExtensions is keyed by extension version, 0 is the default\n const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(\n (ext) => ext.identifier\n )\n\n const basePayload: SignerPayloadJSON = {\n address: signerConfig.address,\n genesisHash,\n blockHash,\n method: Binary.toHex(method),\n signedExtensions,\n nonce: toPjsHex(nonce, 4),\n specVersion: toPjsHex(chainInfo.specVersion, 4),\n transactionVersion: toPjsHex(chainInfo.transactionVersion, 4),\n blockNumber: toPjsHex(blockNumber, 4),\n era: toHex(era) as `0x${string}`,\n tip: toPjsHex(0, 16), // TODO gas station (required for Astar)\n assetId: undefined,\n version: 4,\n }\n\n const { payload, txMetadata } = getPayloadWithMetadataHash(chain, chainInfo, basePayload)\n const shortMetadata = txMetadata ? (toHex(txMetadata) as `0x${string}`) : undefined\n\n // Avail support\n if (payload.signedExtensions.includes(\"CheckAppId\"))\n (payload as SignerPayloadJSON & { appId: number }).appId = 0\n\n log.log(\"[sapi] payload\", { newPayload: payload, txMetadata })\n\n return {\n payload,\n txMetadata, // TODO remove\n shortMetadata,\n }\n}\n","import log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getCallDocs = (chain: Chain, pallet: string, method: string): string | null => {\n try {\n const typeIdCalls = chain.metadata.pallets.find(({ name }) => name === pallet)?.calls?.type\n if (!typeIdCalls) return null\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let palletCalls: any = chain.metadata.lookup[typeIdCalls]\n if (!palletCalls || palletCalls.id !== typeIdCalls)\n palletCalls = chain.metadata.lookup.find((v) => v.id === typeIdCalls)\n\n if (!palletCalls) return null\n\n const call = palletCalls.def.value.find(\n (c: { name: string; docs?: string[] | null }) => c.name === method\n )\n\n return call?.docs?.join(\"\\n\") ?? null\n } catch {\n log.error(\"Failed to find call docs\", { pallet, method, chain })\n return null\n }\n}\n","import { getConstantValueFromMetadata } from \"@talismn/scale\"\n\nimport type { Chain } from \"./types\"\n\nexport const getConstantValue = <T>(chain: Chain, pallet: string, constant: string) => {\n return getConstantValueFromMetadata<T>(\n {\n builder: chain.builder,\n unifiedMetadata: chain.metadata,\n },\n pallet,\n constant\n )\n}\n","import { getConstantValue } from \"./getConstantValue\"\nimport type { Chain } from \"./types\"\n\ntype SystemVersion = {\n spec_name: string\n spec_version: number\n transaction_version: number\n}\n\nexport const getChainInfo = (chain: Chain) => {\n const {\n spec_name: specName,\n spec_version: specVersion,\n transaction_version: transactionVersion,\n } = getConstantValue<SystemVersion>(chain, \"System\", \"Version\")\n\n const base58Prefix = getConstantValue<number>(chain, \"System\", \"SS58Prefix\")\n\n return {\n specName,\n specVersion,\n transactionVersion,\n base58Prefix,\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const getDecodedCall = (palletName: string, methodName: string, args: unknown) => ({\n type: palletName,\n value: { type: methodName, value: args },\n})\n\nexport const getDecodedCallFromPayload = <Res extends DecodedCall>(\n chain: Chain,\n payload: { method: SignerPayloadJSON[\"method\"] }\n): Res => {\n const def = chain.builder.buildDefinition(chain.lookup.call!)\n const decoded = def.dec(payload.method)\n\n return {\n pallet: decoded.type,\n method: decoded.value.type,\n args: decoded.value.value,\n } as Res\n}\n","import {\n Bytes,\n compactNumber,\n createDecoder,\n type Decoder,\n enhanceDecoder,\n extrinsicFormat,\n type StringRecord,\n Struct,\n u8,\n} from \"@polkadot-api/substrate-bindings\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nconst allBytesDec = Bytes(Infinity).dec\n\n/**\n * Decodes a signed extrinsic and extracts the call data.\n * Handles different metadata versions (v14, v15, v16) and extrinsic formats.\n *\n * @param chain - The chain context with metadata and builder\n * @param extrinsicHex - The hex-encoded extrinsic (with 0x prefix)\n * @returns The decoded call with pallet, method, and args, or null if decoding fails\n */\nexport const getDecodedCallFromExtrinsic = <Res extends DecodedCall>(\n chain: Chain,\n extrinsicHex: `0x${string}`\n): Res | null => {\n try {\n const { metadata, builder } = chain\n\n // Build decoder for signed extensions (extra field)\n // signedExtensions is keyed by extension version, 0 is the default\n const extensionsArray = metadata.extrinsic.signedExtensions[0] ?? []\n const extraDec = Struct.dec(\n Object.fromEntries(\n extensionsArray.map((x) => [x.identifier, builder.buildDefinition(x.type)[1]])\n ) as StringRecord<Decoder<unknown>>\n )\n\n // Build call decoder\n let callDec: Decoder<{ type: string; value: { type: string; value: unknown } }>\n const { extrinsic } = metadata\n if (\"address\" in extrinsic) {\n // v15/v16 metadata\n callDec = builder.buildDefinition(extrinsic.call)[1]\n } else {\n // v14 metadata\n const params = metadata.lookup[extrinsic.type]?.params\n const callType = params?.find((v) => v.name === \"Call\")?.type\n if (callType == null) throw new Error(\"Call type not found in metadata\")\n callDec = builder.buildDefinition(callType)[1]\n }\n\n // Build address and signature decoders\n let addressDec: Decoder<unknown>\n let signatureDec: Decoder<unknown>\n if (\"address\" in extrinsic) {\n // v15/v16\n addressDec = builder.buildDefinition(extrinsic.address)[1]\n signatureDec = builder.buildDefinition(extrinsic.signature)[1]\n } else {\n // v14\n const params = metadata.lookup[extrinsic.type]?.params\n const addrType = params?.find((v) => v.name === \"Address\")?.type\n const sigType = params?.find((v) => v.name === \"Signature\")?.type\n if (addrType == null || sigType == null)\n throw new Error(\"Address or Signature type not found\")\n addressDec = builder.buildDefinition(addrType)[1]\n signatureDec = builder.buildDefinition(sigType)[1]\n }\n\n // Build full signed extrinsic body decoder\n const v4Body = Struct.dec({\n address: addressDec,\n signature: signatureDec,\n extra: extraDec,\n callData: allBytesDec,\n })\n\n // Create the full extrinsic decoder\n const extrinsicDecoder = enhanceDecoder(\n createDecoder((data) => {\n const len = compactNumber.dec(data)\n const { type, version } = extrinsicFormat[1](data)\n\n if (type === \"bare\") {\n return { len, version, type, callData: allBytesDec(data) }\n }\n if (type === \"signed\") {\n return { len, version, type, ...v4Body(data) }\n }\n\n // v5 general format\n const extensionVersion = u8.dec(data)\n const extra = extraDec(data)\n return {\n len,\n type,\n version,\n extensionVersion,\n extra,\n callData: allBytesDec(data),\n }\n }),\n (v) => ({\n ...v,\n call: callDec(v.callData),\n })\n )\n\n // Decode the extrinsic\n const decoded = extrinsicDecoder(extrinsicHex)\n\n return {\n pallet: decoded.call.type,\n method: decoded.call.value.type,\n args: decoded.call.value.value,\n } as Res\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: troubleshoting\n console.error(\"[SAPI] Failed to decode extrinsic:\", err)\n return null\n }\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getDispatchErrorMessage = (chain: Chain, err: unknown): string | null => {\n try {\n if (!err) return null\n\n const error = err as UnsafeDispatchError\n if (!error.type) throw new Error(\"Unknown dispatch error\")\n\n const lv1 = DISPATCH_ERROR[error.type as keyof typeof DISPATCH_ERROR]\n if (!lv1) throw new Error(\"Unknown dispatch error\")\n if (lv1 === ERROR_METADATA_LOOKUP)\n return getModuleErrorMessage(chain, error.value as UnsafeModuleError)\n if (typeof lv1 === \"string\") return lv1\n\n const lv2 = lv1[error.value?.type as keyof typeof lv1]\n if (!lv2) throw new Error(\"Unknown dispatch error\")\n if (typeof lv2 === \"string\") return lv2\n\n throw new Error(\"Unknown dispatch error\")\n } catch (cause) {\n log.error(\"Failed to parse runtime error\", { chainId: chain.connector.chainId, cause, err })\n return tryFormatError(err)\n }\n}\n\nconst ERROR_METADATA_LOOKUP = \"METADATA_LOOKUP\"\n\n// only `Module` errors are part of the metadata\n// errors below are defined as part of the runtime but their docs aren't included in the metadata\n// so those are copy/pasted from the polkadot-sdk repo\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L543\nconst ERRORS_TRANSACTIONAL = {\n LimitReached: \"Too many transactional layers have been spawned\",\n NoLayer: \"A transactional layer was expected, but does not exist\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L672\nconst ERRORS_TOKEN = {\n FundsUnavailable: \"Funds are unavailable\",\n OnlyProvider: \"Account that must exist would die\",\n BelowMinimum: \"Account cannot exist with the funds that would be given\",\n CannotCreate: \"Account cannot be created\",\n UnknownAsset: \"The asset in question is unknown\",\n Frozen: \"Funds exist but are frozen\",\n Unsupported: \"Operation is not supported by the asset\",\n CannotCreateHold: \"Account cannot be created for recording amount on hold\",\n NotExpendable: \"Account that is desired to remain would die\",\n Blocked: \"Account cannot receive the assets\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/arithmetic/src/lib.rs#L76\nconst ERRORS_ARITHMETIC = {\n Overflow: \"An overflow would occur\",\n Underflow: \"An underflow would occur\",\n DivisionByZero: \"Division by zero\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L714\nconst DISPATCH_ERROR = {\n CannotLookup: \"Cannot lookup\",\n BadOrigin: \"Bad origin\",\n Module: ERROR_METADATA_LOOKUP,\n ConsumerRemaining: \"Consumer remaining\",\n NoProviders: \"No providers\",\n TooManyConsumers: \"Too many consumers\",\n Token: ERRORS_TOKEN,\n Arithmetic: ERRORS_ARITHMETIC,\n Transactional: ERRORS_TRANSACTIONAL,\n Exhausted: \"Resources exhausted\",\n Corruption: \"State corrupt\",\n Unavailable: \"Resource unavailable\",\n RootNotAllowed: \"Root not allowed\",\n Trie: \"Unknown error\", // unsupported,\n Other: \"Unknown error\", // unsupported,\n}\n\ntype UnsafeDispatchError = {\n type: string\n value:\n | {\n type: string\n value:\n | {\n type: string\n value: undefined\n }\n | undefined\n }\n | undefined\n}\n\ntype UnsafeModuleError = {\n type: string\n value: {\n type: string\n value: undefined\n }\n}\n\nconst getModuleErrorMessage = (chain: Chain, error: UnsafeModuleError): string => {\n try {\n if (!chain.metadata) throw new Error(\"Could not fetch metadata\")\n\n const errorsType = chain.metadata.pallets.find((p) => p.name === error.type)?.errors?.type\n if (typeof errorsType !== \"number\") throw new Error(\"Unknown pallet\")\n\n const lookup = getLookupFn(chain.metadata)\n\n const palletErrors = lookup(errorsType)\n if (palletErrors.type !== \"enum\" || !palletErrors.innerDocs[error.value.type]?.length)\n throw new Error(\"Unknown error type\")\n\n return palletErrors.innerDocs[error.value.type].join(\" \")\n } catch (err) {\n log.error(\"Failed to parse module error\", { chainId: chain.connector.chainId, error, err })\n return [error.type, error.value.type].join(\": \")\n }\n}\n\nconst tryFormatError = (err: unknown): string => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const unsafeErr = err as any\n if (unsafeErr.type && unsafeErr.value?.type)\n return [unsafeErr.type, unsafeErr.value.type].join(\": \")\n } catch {\n // ignore\n }\n\n return \"Unknown error\"\n}\n","import { toHex } from \"@polkadot-api/utils\"\n\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getRuntimeCallResult = async <T>(\n chain: Chain,\n apiName: string,\n method: string,\n args: unknown[]\n) => {\n const call = chain.builder.buildRuntimeCall(apiName, method)\n\n const hex = await getSendRequestResult<string>(chain, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n}\n","import type { Chain } from \"./types\"\n\nexport const isApiAvailable = (chain: Chain, name: string, method: string) => {\n return chain.metadata.apis.some(\n (a) => a.name === name && a.methods.some((m) => m.name === method)\n )\n}\n","import type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"@polkadot-api/substrate-bindings\"\n\nimport log from \"../log\"\nimport type { DecodedCall } from \"../types\"\nimport { getDispatchErrorMessage } from \"./errors\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { isApiAvailable } from \"./isApiAvailable\"\nimport type { Chain } from \"./types\"\n\ntype DryRunResult = (\n | typeof polkadot\n | typeof polkadotAssetHub\n)[\"descriptors\"][\"apis\"][\"DryRunApi\"][\"dry_run_call\"][1]\n\nexport const getDryRunCall = async <T>(\n chain: Chain,\n from: string,\n decodedCall: DecodedCall<unknown>\n): Promise<\n | {\n available: boolean\n data: null\n ok?: undefined\n errorMessage?: undefined\n }\n | {\n available: boolean\n data: T\n ok: boolean\n errorMessage: string | null\n }\n> => {\n try {\n if (!isApiAvailable(chain, \"DryRunApi\", \"dry_run_call\"))\n return {\n available: false,\n data: null,\n }\n\n const origin = Enum(\"system\", Enum(\"Signed\", from))\n\n const { pallet, method, args } = decodedCall\n const call = { type: pallet, value: { type: method, value: args } }\n\n // This will throw an error if the api is not available on that chain\n const data = await getRuntimeCallResult<DryRunResult>(chain, \"DryRunApi\", \"dry_run_call\", [\n origin,\n call,\n ])\n\n const ok = data.success && data.value.execution_result.success\n const errorMessage =\n data.success && !data.value.execution_result.success\n ? getDispatchErrorMessage(chain, data.value.execution_result.value.error)\n : null\n\n return {\n available: true,\n // NOTE: we can't re-export `@polkadot-api/descriptors` from this package.\n // So, the caller of this function must pass in their own instance of `type DryRunResult` as the generic argument `T`.\n data: data as T,\n ok,\n errorMessage,\n }\n } catch (err) {\n // Note : err is null if chain doesnt have the api\n log.error(\"Failed to dry run\", { chainId: chain.connector.chainId, err })\n return {\n available: false,\n data: null,\n }\n }\n}\n","import { u32, u128 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\n\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// fee estimation fallback for chains that dont have metadata v15 yet\n// (the runtime-call codecs needed to decode this with the dynamic builder require metadata v15)\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n // the full encoded extrinsic, INCLUDING its compact length prefix: the runtime\n // decodes the uxt argument as an opaque length-prefixed UncheckedExtrinsic\n signedTxBytes: Uint8Array\n): Promise<ExtrinsicDispatchInfo> => {\n const args = mergeUint8([signedTxBytes, u32.enc(signedTxBytes.length)])\n\n const result = (await chain.connector.send(\n \"state_call\",\n [\"TransactionPaymentApi_query_info\", toHex(args)],\n true\n )) as `0x${string}`\n\n // RuntimeDispatchInfo = { weight: WeightV1 (u64) | WeightV2 (2x compact), class: enum (1 byte), partial_fee: u128 }\n // the weight shape varies across old runtimes, but partial_fee is always the trailing fixed-size field\n const bytes = fromHex(result)\n if (bytes.length < 16) throw new Error(\"Invalid RuntimeDispatchInfo\")\n // .slice (copy), NOT .subarray: papi codecs read offset views from the buffer start\n const partialFee = u128.dec(bytes.slice(bytes.length - 16))\n\n return {\n partialFee: partialFee.toString(),\n }\n}\n","import { createV4Tx } from \"@polkadot-api/signers-common\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getAddressBytes, isEthereumAddress } from \"./papi\"\nimport type { Chain } from \"./types\"\n\n/** strips the leading compact length prefix from an encoded extrinsic */\nconst stripLengthPrefix = (tx: Uint8Array): Uint8Array => {\n const mode = tx[0] & 3\n const prefixLen = mode === 0 ? 1 : mode === 1 ? 2 : mode === 2 ? 4 : 1 + (tx[0] >> 2) + 4\n return tx.subarray(prefixLen)\n}\n\nexport const getFeeEstimate = async (chain: Chain, payload: SignerPayloadJSON) => {\n // build a fake-signed extrinsic - fees depend on the encoded length, not the signature content\n const { callData, extra } = getPjsTxHelper(chain.hexMetadata, CUSTOM_SIGNED_EXTENSIONS)(payload)\n const fakeSignature = isEthereumAddress(payload.address)\n ? new Uint8Array(65) // AccountId20 chains: raw 65-byte signature, no MultiSignature prefix\n : new Uint8Array(66).fill(2, 0, 1) // MultiSignature ecdsa variant, the longest (type byte + 65) so the length fee is never underestimated\n\n const signedTx = createV4Tx(\n chain.metadata,\n getAddressBytes(payload.address),\n fakeSignature,\n [extra],\n callData\n )\n\n const bytes = stripLengthPrefix(signedTx)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [bytes, signedTx.length]\n )\n // Do not throw if partialFee is 0n. This is a valid response, eg: Bittensor remove_stake fee estimation is 0n.\n if (!result?.partial_fee && result.partial_fee !== 0n) {\n throw new Error(\"partialFee is not found\")\n }\n return result.partial_fee\n } catch (err) {\n log.error(\"Failed to get fee estimate using getRuntimeCallValue\", { err })\n }\n\n // fallback to pjs encoded state call, in case the above fails (extracting runtime calls codecs might require metadata V15)\n // Note: PAPI will consider TransactionPaymentApi as first class api so it should work even without V15, but this is not the case yet.\n const { partialFee } = await getExtrinsicDispatchInfo(chain, signedTx)\n\n return BigInt(partialFee)\n}\n","import type { SapiConnectorProps } from \"../types\"\n\nexport type SapiConnector = Required<SapiConnectorProps>\n\nexport const getSapiConnector = ({\n chainId,\n send,\n submit,\n submitWithBittensorMevShield,\n}: SapiConnectorProps): SapiConnector => ({\n chainId,\n send,\n submit: (...args) => {\n if (submit) return submit(...args)\n throw new Error(\"submit handler not provided\")\n },\n submitWithBittensorMevShield: (...args) => {\n if (submitWithBittensorMevShield) return submitWithBittensorMevShield(...args)\n throw new Error(\"submitWithBittensorMevShield handler not provided\")\n },\n})\n","import type { Chain } from \"./types\"\n\nexport const hasConstant = (chain: Chain, pallet: string, constant: string): boolean => {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n return !!palletDef?.constants.some((c) => c.name === constant)\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const hasEvent = (chain: Chain, pallet: string, event: string): boolean => {\n try {\n const eventsType = chain.metadata.pallets.find((p) => p.name === pallet)?.events?.type\n if (typeof eventsType !== \"number\") return false\n\n const lookup = getLookupFn(chain.metadata)\n const palletEvents = lookup(eventsType)\n\n return palletEvents.type === \"enum\" && event in palletEvents.innerDocs\n } catch (err) {\n log.error(\"Failed to check event existence\", { pallet, event, err })\n return false\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { ScaleApiSubmitMode } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const submit = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n): Promise<{ hash: `0x${string}`; innerHash?: `0x${string}` }> => {\n switch (mode) {\n case \"bittensor-mev-shield\":\n if (signature)\n throw new Error(\"Signature should not be provided when using bittensor-mev-shield mode\")\n return chain.connector.submitWithBittensorMevShield(payload, txInfo)\n\n default:\n return chain.connector.submit(payload, signature, txInfo)\n }\n}\n","import { parseMetadataRpc } from \"@talismn/scale\"\nimport { getCallDocs } from \"./helpers/getCallDocs\"\nimport { getChainInfo } from \"./helpers/getChainInfo\"\nimport { getConstantValue } from \"./helpers/getConstantValue\"\nimport { getDecodedCall, getDecodedCallFromPayload } from \"./helpers/getDecodedCall\"\nimport { getDecodedCallFromExtrinsic } from \"./helpers/getDecodedCallFromExtrinsic\"\nimport { getDryRunCall } from \"./helpers/getDryRunCall\"\nimport { getFeeEstimate } from \"./helpers/getFeeEstimate\"\nimport { getRuntimeCallResult } from \"./helpers/getRuntimeCallResult\"\nimport { getSapiConnector } from \"./helpers/getSapiConnector\"\nimport { getSignerPayloadJSON } from \"./helpers/getSignerPayloadJSON\"\nimport { getStorageValue } from \"./helpers/getStorageValue\"\nimport { hasConstant } from \"./helpers/hasConstant\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\nimport type { ExtDef, SignerPayloadJSON } from \"./pjsInterop\"\nimport type {\n DecodedCall,\n PayloadSignerConfig,\n SapiConnectorProps,\n ScaleApiSubmitMode,\n} from \"./types\"\n\nexport type ScaleApi = NonNullable<ReturnType<typeof getScaleApi>>\n\nexport const getScaleApi = (\n connector: SapiConnectorProps,\n hexMetadata: `0x${string}`,\n token: { symbol: string; decimals: number },\n hasCheckMetadataHash?: boolean,\n signedExtensions?: ExtDef,\n registryTypes?: unknown\n) => {\n const { unifiedMetadata: metadata, lookupFn: lookup, builder } = parseMetadataRpc(hexMetadata)\n\n const chain: Chain = {\n connector: getSapiConnector(connector),\n hexMetadata,\n\n token,\n hasCheckMetadataHash,\n signedExtensions,\n registryTypes,\n\n metadata,\n lookup,\n builder,\n metadataRpc: hexMetadata,\n }\n\n const chainInfo = getChainInfo(chain)\n\n const { specName, specVersion, base58Prefix } = chainInfo\n\n return {\n id: `${connector.chainId}::${specName}::${specVersion}`,\n chainId: connector.chainId,\n specName,\n specVersion,\n hasCheckMetadataHash,\n base58Prefix,\n token: chain.token,\n chain,\n\n getConstant: <T>(pallet: string, constant: string) =>\n getConstantValue<T>(chain, pallet, constant),\n\n getStorage: <T>(pallet: string, entry: string, keys: unknown[], at?: string) =>\n getStorageValue<T>(chain, pallet, entry, keys, at),\n\n getDecodedCall: (pallet: string, method: string, args: unknown) =>\n getDecodedCall(pallet, method, args),\n\n getDecodedCallFromPayload: <Res extends DecodedCall>(payload: {\n method: SignerPayloadJSON[\"method\"]\n }) => getDecodedCallFromPayload<Res>(chain, payload),\n\n getDecodedCallFromExtrinsic: <Res extends DecodedCall>(extrinsicHex: `0x${string}`) =>\n getDecodedCallFromExtrinsic<Res>(chain, extrinsicHex),\n\n getExtrinsicPayload: (\n pallet: string,\n method: string,\n args: unknown,\n config: PayloadSignerConfig\n ) => getSignerPayloadJSON(chain, pallet, method, args, config, chainInfo),\n\n getFeeEstimate: (payload: SignerPayloadJSON) => getFeeEstimate(chain, payload),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n submit: (\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n ) => submit(chain, payload, signature, txInfo, mode),\n\n getCallDocs: (pallet: string, method: string) => getCallDocs(chain, pallet, method),\n\n getDryRunCall: <T>(from: string, decodedCall: DecodedCall<unknown>) =>\n getDryRunCall<T>(chain, from, decodedCall),\n\n isApiAvailable: (name: string, method: string) => isApiAvailable(chain, name, method),\n\n hasEvent: (pallet: string, event: string) => hasEvent(chain, pallet, event),\n\n hasConstant: (pallet: string, constant: string) => hasConstant(chain, pallet, constant),\n }\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -158,12 +158,12 @@ const getSignerPayloadJSON = async (chain, palletName, methodName, args, signerC
|
|
|
158
158
|
getStorageValue(chain, "System", "Number", [])
|
|
159
159
|
]);
|
|
160
160
|
if (!genesisHash) throw new Error("Genesis hash not found");
|
|
161
|
-
if (!blockHash) throw new Error("Block hash not found");
|
|
162
161
|
let blockNumber = blockNumberFinalized;
|
|
163
162
|
if (blockNumberCurrent - blockNumberFinalized > 32) {
|
|
164
163
|
blockNumber = blockNumberCurrent - 16;
|
|
165
164
|
blockHash = await getStorageValue(chain, "System", "BlockHash", [blockNumber]);
|
|
166
165
|
}
|
|
166
|
+
if (!blockHash) throw new Error("Block hash not found");
|
|
167
167
|
const era = mortal({
|
|
168
168
|
period: 64,
|
|
169
169
|
phase: blockNumber % 64
|
|
@@ -377,8 +377,8 @@ const DISPATCH_ERROR = {
|
|
|
377
377
|
Blocked: "Account cannot receive the assets"
|
|
378
378
|
},
|
|
379
379
|
Arithmetic: {
|
|
380
|
-
Overflow: "An
|
|
381
|
-
Underflow: "An
|
|
380
|
+
Overflow: "An overflow would occur",
|
|
381
|
+
Underflow: "An underflow would occur",
|
|
382
382
|
DivisionByZero: "Division by zero"
|
|
383
383
|
},
|
|
384
384
|
Transactional: {
|
|
@@ -395,9 +395,9 @@ const DISPATCH_ERROR = {
|
|
|
395
395
|
const getModuleErrorMessage = (chain, error) => {
|
|
396
396
|
try {
|
|
397
397
|
if (!chain.metadata) throw new Error("Could not fetch metadata");
|
|
398
|
-
const
|
|
399
|
-
if (typeof
|
|
400
|
-
const palletErrors = getLookupFn(chain.metadata)(
|
|
398
|
+
const errorsType = chain.metadata.pallets.find((p) => p.name === error.type)?.errors?.type;
|
|
399
|
+
if (typeof errorsType !== "number") throw new Error("Unknown pallet");
|
|
400
|
+
const palletErrors = getLookupFn(chain.metadata)(errorsType);
|
|
401
401
|
if (palletErrors.type !== "enum" || !palletErrors.innerDocs[error.value.type]?.length) throw new Error("Unknown error type");
|
|
402
402
|
return palletErrors.innerDocs[error.value.type].join(" ");
|
|
403
403
|
} catch (err) {
|
|
@@ -485,7 +485,7 @@ const getFeeEstimate = async (chain, payload) => {
|
|
|
485
485
|
const signedTx = createV4Tx(chain.metadata, getAddressBytes(payload.address), fakeSignature, [extra], callData);
|
|
486
486
|
const bytes = stripLengthPrefix(signedTx);
|
|
487
487
|
try {
|
|
488
|
-
const result = await getRuntimeCallResult(chain, "TransactionPaymentApi", "query_info", [bytes,
|
|
488
|
+
const result = await getRuntimeCallResult(chain, "TransactionPaymentApi", "query_info", [bytes, signedTx.length]);
|
|
489
489
|
if (!result?.partial_fee && result.partial_fee !== 0n) throw new Error("partialFee is not found");
|
|
490
490
|
return result.partial_fee;
|
|
491
491
|
} catch (err) {
|
|
@@ -517,9 +517,9 @@ const hasConstant = (chain, pallet, constant) => {
|
|
|
517
517
|
//#region src/helpers/hasEvent.ts
|
|
518
518
|
const hasEvent = (chain, pallet, event) => {
|
|
519
519
|
try {
|
|
520
|
-
const
|
|
521
|
-
if (typeof
|
|
522
|
-
const palletEvents = getLookupFn(chain.metadata)(
|
|
520
|
+
const eventsType = chain.metadata.pallets.find((p) => p.name === pallet)?.events?.type;
|
|
521
|
+
if (typeof eventsType !== "number") return false;
|
|
522
|
+
const palletEvents = getLookupFn(chain.metadata)(eventsType);
|
|
523
523
|
return palletEvents.type === "enum" && event in palletEvents.innerDocs;
|
|
524
524
|
} catch (err) {
|
|
525
525
|
log_default.error("Failed to check event existence", {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["u32","packageJson.name","getPjsTxHelper","getPjsTxHelper"],"sources":["../src/customSignedExtensions.ts","../src/fetchBestMetadata.ts","../package.json","../src/log.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getDryRunCall.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/hasConstant.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts","../src/sapi.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport type { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\n\ntype CustomExtensionMappers = NonNullable<Parameters<typeof getPjsTxHelper>[1]>\n\nconst EMPTY = new Uint8Array()\n\n/**\n * Encoders for chain-specific signed extensions that `@polkadot-api/tx-utils` doesn't know about.\n */\nexport const CUSTOM_SIGNED_EXTENSIONS: CustomExtensionMappers = {\n // Avail app-id; wallet-built payloads default it to 0 (see getSignerPayloadJSON)\n CheckAppId: ({ pjsPayload }) => {\n const appId = Number((pjsPayload as { appId?: unknown }).appId ?? 0)\n return {\n value: compactNumber.enc(Number.isFinite(appId) ? appId : 0),\n additionalSigned: EMPTY,\n }\n },\n}\n","import { toHex } from \"@polkadot-api/utils\"\nimport { u32, Vector } from \"scale-ts\"\n\nconst MAGIC_NUMBER = 1635018093\n\n// it's important to set a max because some chains also return high invalid version numbers in the metadata_versions list (ex on Polkadot, related to JAM?)\nexport const MAX_SUPPORTED_METADATA_VERSION = 15 // v16 sometimes outputs different metadata hashes, ignore v16 until that is fixed in PAPI\n\ntype RpcSendFunc = <T>(method: string, params: unknown[], isCacheable?: boolean) => Promise<T>\n\n/**\n * Fetches the highest supported version of metadata from the chain.\n *\n * @param rpcSend\n * @returns hex-encoded metadata starting with the magic number\n */\nexport const fetchBestMetadata = async (\n rpcSend: RpcSendFunc,\n allowLegacyFallback?: boolean\n): Promise<`0x${string}`> => {\n try {\n // fetch available versions of metadata\n const metadataVersions = await rpcSend<string>(\n \"state_call\",\n [\"Metadata_metadata_versions\", \"0x\"],\n true\n )\n const availableVersions = Vector(u32).dec(metadataVersions)\n const bestVersion = Math.max(\n ...availableVersions.filter((v) => v <= MAX_SUPPORTED_METADATA_VERSION)\n )\n\n const metadata = await rpcSend<`0x${string}`>(\n \"state_call\",\n [\"Metadata_metadata_at_version\", toHex(u32.enc(bestVersion))],\n true\n )\n\n return normalizeMetadata(metadata)\n } catch (cause) {\n // if the chain doesnt support the Metadata pallet, fallback to legacy rpc provided metadata (V14)\n const message = (cause as { message?: string })?.message\n if (\n allowLegacyFallback ||\n message?.includes(\"is not found\") || // ex: crust standalone\n message?.includes(\"Module doesn't have export Metadata_metadata_versions\") || // ex: 3DPass\n message?.includes(\"Exported method Metadata_metadata_versions is not found\") || // ex: sora-polkadot & sora-standalone\n message?.includes(\"Execution, MethodNotFound, Metadata_metadata_versions\") // ex: stafi\n ) {\n return (await rpcSend(\"state_getMetadata\", [], true)) as `0x${string}`\n }\n\n // otherwise throw so it can be handled by the caller\n throw new Error(\"Failed to fetch metadata\", { cause })\n }\n}\n\n/**\n * Removes everything before the magic number in the metadata.\n * This ensures Opaque metadata is usable by pjs\n */\nconst normalizeMetadata = (metadata: `0x${string}`): `0x${string}` => {\n const hexMagicNumber = toHex(u32.enc(MAGIC_NUMBER)).slice(2)\n\n const magicNumberIndex = metadata.indexOf(hexMagicNumber)\n if (magicNumberIndex === -1) throw new Error(\"Invalid metadata format: magic number not found\")\n\n return `0x${metadata.slice(magicNumberIndex)}` as `0x${string}`\n}\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getPayloadWithMetadataHash = (\n chain: Chain,\n chainInfo: ChainInfo,\n payload: SignerPayloadJSON\n): { payload: SignerPayloadJSON; txMetadata?: Uint8Array } => {\n if (!chain.hasCheckMetadataHash || !payload.signedExtensions.includes(\"CheckMetadataHash\"))\n return {\n payload,\n txMetadata: undefined,\n }\n\n try {\n const { decimals, symbol: tokenSymbol } = chain.token\n const { base58Prefix, specName, specVersion } = chainInfo\n const metadataHashInputs = { tokenSymbol, decimals, base58Prefix, specName, specVersion }\n\n // since ultimately this needs a V15 object, would be nice if this accepted one directly as input\n const merkleizedMetadata = merkleizeMetadata(chain.hexMetadata, metadataHashInputs)\n const metadataHash = toHex(merkleizedMetadata.digest()) as `0x${string}`\n log.log(\"metadataHash\", metadataHash, metadataHashInputs)\n\n const payloadWithMetadataHash = {\n ...payload,\n mode: 1,\n metadataHash,\n withSignedTransaction: true,\n }\n\n const { callData, extra, additionalSigned } = getPjsTxHelper(\n chain.hexMetadata,\n CUSTOM_SIGNED_EXTENSIONS\n )(payloadWithMetadataHash)\n const barePayload = mergeUint8([callData, extra, additionalSigned])\n\n const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(barePayload)\n\n return {\n payload: payloadWithMetadataHash,\n txMetadata,\n }\n } catch (err) {\n log.error(\"Failed to get shortened metadata\", { error: err })\n return {\n payload,\n txMetadata: undefined,\n }\n }\n}\n","import type { Chain } from \"./types\"\n\nexport const getSendRequestResult = <Res>(\n chain: Chain,\n method: string,\n params: unknown[],\n isCacheable?: boolean\n): Promise<Res> => {\n return chain.connector.send(method, params, isCacheable) as Promise<Res>\n}\n","import { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getStorageValue = async <T>(\n chain: Chain,\n pallet: string,\n entry: string,\n keys: unknown[],\n at?: string\n) => {\n const storageCodec = chain.builder.buildStorage(pallet, entry)\n const stateKey = storageCodec.keys.enc(...keys)\n\n const hexValue = await getSendRequestResult<string | null>(chain, \"state_getStorage\", [\n stateKey,\n at,\n ])\n if (!hexValue) return null as T // caller will need to expect null when applicable\n\n return storageCodec.value.dec(hexValue) as T\n}\n","import { Bytes, enhanceEncoder, getSs58AddressInfo, u16 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////// Utilities from PAPI /////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const toPjsHex = (value: number | bigint, minByteLen?: number) => {\n let inner = value.toString(16)\n inner = (inner.length % 2 ? \"0\" : \"\") + inner\n const nPaddedBytes = Math.max(0, (minByteLen || 0) - inner.length / 2)\n return `0x${\"00\".repeat(nPaddedBytes)}${inner}` as `0x${string}`\n}\n\nexport const mortal = enhanceEncoder(Bytes(2).enc, (value: { period: number; phase: number }) => {\n const factor = Math.max(value.period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15)\n const right = (value.phase / factor) << 4\n return u16.enc(left | right)\n})\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nexport const isEthereumAddress = (address: string) => /^0x[0-9a-fA-F]{40}$/.test(address)\n\n/** decodes an ss58 or ethereum address into its raw account bytes */\nexport const getAddressBytes = (address: string): Uint8Array => {\n if (isEthereumAddress(address)) return fromHex(address)\n const info = getSs58AddressInfo(address)\n if (!info.isValid) throw new Error(`Invalid address: ${address}`)\n return info.publicKey\n}\n","import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { PayloadSignerConfig } from \"../types\"\nimport { getPayloadWithMetadataHash } from \"./getPayloadWithMetadataHash\"\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport { getStorageValue } from \"./getStorageValue\"\nimport { mortal, toPjsHex } from \"./papi\"\nimport type { Chain, ChainInfo } from \"./types\"\n\n/** validity period of a signed payload in blocks: the mortal era every payload is built with */\nexport const ERA_PERIOD = 64\n\nexport const getSignerPayloadJSON = async (\n chain: Chain,\n palletName: string,\n methodName: string,\n args: unknown,\n signerConfig: PayloadSignerConfig,\n chainInfo: ChainInfo\n): Promise<{\n payload: SignerPayloadJSON\n txMetadata: Uint8Array | undefined\n shortMetadata: `0x${string}` | undefined\n}> => {\n const { codec, location } = chain.builder.buildCall(palletName, methodName)\n const method = mergeUint8([new Uint8Array(location), codec.enc(args)])\n\n // on unstable networks with lots of forks (ex: westend asset hub as of june 2025),\n // using a finalized block as reference for mortality is necessary for txs to get through\n let blockHash = await getSendRequestResult<`0x${string}`>(\n chain,\n \"chain_getFinalizedHead\",\n [],\n false\n )\n\n const [nonce, genesisHash, blockNumberFinalized, blockNumberCurrent] = await Promise.all([\n getSendRequestResult<number>(chain, \"system_accountNextIndex\", [signerConfig.address], false),\n getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [0]),\n getStorageValue<number>(chain, \"System\", \"Number\", [], blockHash),\n getStorageValue<number>(chain, \"System\", \"Number\", []),\n ])\n if (!genesisHash) throw new Error(\"Genesis hash not found\")\n if (!blockHash) throw new Error(\"Block hash not found\")\n\n let blockNumber = blockNumberFinalized\n\n // on Autonomys the finalized block hash is wrong (7000 blocks behind),\n // if we use it to craft a tx it will be invalid\n // => if finalized block number is more than 32 blocks behind, use current - 16\n if (blockNumberCurrent - blockNumberFinalized > 32) {\n blockNumber = blockNumberCurrent - 16\n\n const binBlockHash = await getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [\n blockNumber,\n ])\n blockHash = binBlockHash\n }\n\n const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD })\n // signedExtensions is keyed by extension version, 0 is the default\n const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(\n (ext) => ext.identifier\n )\n\n const basePayload: SignerPayloadJSON = {\n address: signerConfig.address,\n genesisHash,\n blockHash,\n method: Binary.toHex(method),\n signedExtensions,\n nonce: toPjsHex(nonce, 4),\n specVersion: toPjsHex(chainInfo.specVersion, 4),\n transactionVersion: toPjsHex(chainInfo.transactionVersion, 4),\n blockNumber: toPjsHex(blockNumber, 4),\n era: toHex(era) as `0x${string}`,\n tip: toPjsHex(0, 16), // TODO gas station (required for Astar)\n assetId: undefined,\n version: 4,\n }\n\n const { payload, txMetadata } = getPayloadWithMetadataHash(chain, chainInfo, basePayload)\n const shortMetadata = txMetadata ? (toHex(txMetadata) as `0x${string}`) : undefined\n\n // Avail support\n if (payload.signedExtensions.includes(\"CheckAppId\"))\n (payload as SignerPayloadJSON & { appId: number }).appId = 0\n\n log.log(\"[sapi] payload\", { newPayload: payload, txMetadata })\n\n return {\n payload,\n txMetadata, // TODO remove\n shortMetadata,\n }\n}\n","import log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getCallDocs = (chain: Chain, pallet: string, method: string): string | null => {\n try {\n const typeIdCalls = chain.metadata.pallets.find(({ name }) => name === pallet)?.calls?.type\n if (!typeIdCalls) return null\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let palletCalls: any = chain.metadata.lookup[typeIdCalls]\n if (!palletCalls || palletCalls.id !== typeIdCalls)\n palletCalls = chain.metadata.lookup.find((v) => v.id === typeIdCalls)\n\n if (!palletCalls) return null\n\n const call = palletCalls.def.value.find(\n (c: { name: string; docs?: string[] | null }) => c.name === method\n )\n\n return call?.docs?.join(\"\\n\") ?? null\n } catch {\n log.error(\"Failed to find call docs\", { pallet, method, chain })\n return null\n }\n}\n","import { getConstantValueFromMetadata } from \"@talismn/scale\"\n\nimport type { Chain } from \"./types\"\n\nexport const getConstantValue = <T>(chain: Chain, pallet: string, constant: string) => {\n return getConstantValueFromMetadata<T>(\n {\n builder: chain.builder,\n unifiedMetadata: chain.metadata,\n },\n pallet,\n constant\n )\n}\n","import { getConstantValue } from \"./getConstantValue\"\nimport type { Chain } from \"./types\"\n\ntype SystemVersion = {\n spec_name: string\n spec_version: number\n transaction_version: number\n}\n\nexport const getChainInfo = (chain: Chain) => {\n const {\n spec_name: specName,\n spec_version: specVersion,\n transaction_version: transactionVersion,\n } = getConstantValue<SystemVersion>(chain, \"System\", \"Version\")\n\n const base58Prefix = getConstantValue<number>(chain, \"System\", \"SS58Prefix\")\n\n return {\n specName,\n specVersion,\n transactionVersion,\n base58Prefix,\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const getDecodedCall = (palletName: string, methodName: string, args: unknown) => ({\n type: palletName,\n value: { type: methodName, value: args },\n})\n\nexport const getDecodedCallFromPayload = <Res extends DecodedCall>(\n chain: Chain,\n payload: { method: SignerPayloadJSON[\"method\"] }\n): Res => {\n const def = chain.builder.buildDefinition(chain.lookup.call!)\n const decoded = def.dec(payload.method)\n\n return {\n pallet: decoded.type,\n method: decoded.value.type,\n args: decoded.value.value,\n } as Res\n}\n","import {\n Bytes,\n compactNumber,\n createDecoder,\n type Decoder,\n enhanceDecoder,\n extrinsicFormat,\n type StringRecord,\n Struct,\n u8,\n} from \"@polkadot-api/substrate-bindings\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nconst allBytesDec = Bytes(Infinity).dec\n\n/**\n * Decodes a signed extrinsic and extracts the call data.\n * Handles different metadata versions (v14, v15, v16) and extrinsic formats.\n *\n * @param chain - The chain context with metadata and builder\n * @param extrinsicHex - The hex-encoded extrinsic (with 0x prefix)\n * @returns The decoded call with pallet, method, and args, or null if decoding fails\n */\nexport const getDecodedCallFromExtrinsic = <Res extends DecodedCall>(\n chain: Chain,\n extrinsicHex: `0x${string}`\n): Res | null => {\n try {\n const { metadata, builder } = chain\n\n // Build decoder for signed extensions (extra field)\n // signedExtensions is keyed by extension version, 0 is the default\n const extensionsArray = metadata.extrinsic.signedExtensions[0] ?? []\n const extraDec = Struct.dec(\n Object.fromEntries(\n extensionsArray.map((x) => [x.identifier, builder.buildDefinition(x.type)[1]])\n ) as StringRecord<Decoder<unknown>>\n )\n\n // Build call decoder\n let callDec: Decoder<{ type: string; value: { type: string; value: unknown } }>\n const { extrinsic } = metadata\n if (\"address\" in extrinsic) {\n // v15/v16 metadata\n callDec = builder.buildDefinition(extrinsic.call)[1]\n } else {\n // v14 metadata\n const params = metadata.lookup[extrinsic.type]?.params\n const callType = params?.find((v) => v.name === \"Call\")?.type\n if (callType == null) throw new Error(\"Call type not found in metadata\")\n callDec = builder.buildDefinition(callType)[1]\n }\n\n // Build address and signature decoders\n let addressDec: Decoder<unknown>\n let signatureDec: Decoder<unknown>\n if (\"address\" in extrinsic) {\n // v15/v16\n addressDec = builder.buildDefinition(extrinsic.address)[1]\n signatureDec = builder.buildDefinition(extrinsic.signature)[1]\n } else {\n // v14\n const params = metadata.lookup[extrinsic.type]?.params\n const addrType = params?.find((v) => v.name === \"Address\")?.type\n const sigType = params?.find((v) => v.name === \"Signature\")?.type\n if (addrType == null || sigType == null)\n throw new Error(\"Address or Signature type not found\")\n addressDec = builder.buildDefinition(addrType)[1]\n signatureDec = builder.buildDefinition(sigType)[1]\n }\n\n // Build full signed extrinsic body decoder\n const v4Body = Struct.dec({\n address: addressDec,\n signature: signatureDec,\n extra: extraDec,\n callData: allBytesDec,\n })\n\n // Create the full extrinsic decoder\n const extrinsicDecoder = enhanceDecoder(\n createDecoder((data) => {\n const len = compactNumber.dec(data)\n const { type, version } = extrinsicFormat[1](data)\n\n if (type === \"bare\") {\n return { len, version, type, callData: allBytesDec(data) }\n }\n if (type === \"signed\") {\n return { len, version, type, ...v4Body(data) }\n }\n\n // v5 general format\n const extensionVersion = u8.dec(data)\n const extra = extraDec(data)\n return {\n len,\n type,\n version,\n extensionVersion,\n extra,\n callData: allBytesDec(data),\n }\n }),\n (v) => ({\n ...v,\n call: callDec(v.callData),\n })\n )\n\n // Decode the extrinsic\n const decoded = extrinsicDecoder(extrinsicHex)\n\n return {\n pallet: decoded.call.type,\n method: decoded.call.value.type,\n args: decoded.call.value.value,\n } as Res\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: troubleshoting\n console.error(\"[SAPI] Failed to decode extrinsic:\", err)\n return null\n }\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getDispatchErrorMessage = (chain: Chain, err: unknown): string | null => {\n try {\n if (!err) return null\n\n const error = err as UnsafeDispatchError\n if (!error.type) throw new Error(\"Unknown dispatch error\")\n\n const lv1 = DISPATCH_ERROR[error.type as keyof typeof DISPATCH_ERROR]\n if (!lv1) throw new Error(\"Unknown dispatch error\")\n if (lv1 === ERROR_METADATA_LOOKUP)\n return getModuleErrorMessage(chain, error.value as UnsafeModuleError)\n if (typeof lv1 === \"string\") return lv1\n\n const lv2 = lv1[error.value?.type as keyof typeof lv1]\n if (!lv2) throw new Error(\"Unknown dispatch error\")\n if (typeof lv2 === \"string\") return lv2\n\n throw new Error(\"Unknown dispatch error\")\n } catch (cause) {\n log.error(\"Failed to parse runtime error\", { chainId: chain.connector.chainId, cause, err })\n return tryFormatError(err)\n }\n}\n\nconst ERROR_METADATA_LOOKUP = \"METADATA_LOOKUP\"\n\n// only `Module` errors are part of the metadata\n// errors below are defined as part of the runtime but their docs aren't included in the metadata\n// so those are copy/pasted from the polkadot-sdk repo\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L543\nconst ERRORS_TRANSACTIONAL = {\n LimitReached: \"Too many transactional layers have been spawned\",\n NoLayer: \"A transactional layer was expected, but does not exist\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L672\nconst ERRORS_TOKEN = {\n FundsUnavailable: \"Funds are unavailable\",\n OnlyProvider: \"Account that must exist would die\",\n BelowMinimum: \"Account cannot exist with the funds that would be given\",\n CannotCreate: \"Account cannot be created\",\n UnknownAsset: \"The asset in question is unknown\",\n Frozen: \"Funds exist but are frozen\",\n Unsupported: \"Operation is not supported by the asset\",\n CannotCreateHold: \"Account cannot be created for recording amount on hold\",\n NotExpendable: \"Account that is desired to remain would die\",\n Blocked: \"Account cannot receive the assets\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/arithmetic/src/lib.rs#L76\nconst ERRORS_ARITHMETIC = {\n Overflow: \"An underflow would occur\",\n Underflow: \"An overflow would occur\",\n DivisionByZero: \"Division by zero\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L714\nconst DISPATCH_ERROR = {\n CannotLookup: \"Cannot lookup\",\n BadOrigin: \"Bad origin\",\n Module: ERROR_METADATA_LOOKUP,\n ConsumerRemaining: \"Consumer remaining\",\n NoProviders: \"No providers\",\n TooManyConsumers: \"Too many consumers\",\n Token: ERRORS_TOKEN,\n Arithmetic: ERRORS_ARITHMETIC,\n Transactional: ERRORS_TRANSACTIONAL,\n Exhausted: \"Resources exhausted\",\n Corruption: \"State corrupt\",\n Unavailable: \"Resource unavailable\",\n RootNotAllowed: \"Root not allowed\",\n Trie: \"Unknown error\", // unsupported,\n Other: \"Unknown error\", // unsupported,\n}\n\ntype UnsafeDispatchError = {\n type: string\n value:\n | {\n type: string\n value:\n | {\n type: string\n value: undefined\n }\n | undefined\n }\n | undefined\n}\n\ntype UnsafeModuleError = {\n type: string\n value: {\n type: string\n value: undefined\n }\n}\n\nconst getModuleErrorMessage = (chain: Chain, error: UnsafeModuleError): string => {\n try {\n if (!chain.metadata) throw new Error(\"Could not fetch metadata\")\n\n const pallet = chain.metadata.pallets.find((p) => p.name === error.type)\n if (typeof pallet?.errors !== \"number\") throw new Error(\"Unknown pallet\")\n\n const lookup = getLookupFn(chain.metadata)\n\n const palletErrors = lookup(pallet.errors)\n if (palletErrors.type !== \"enum\" || !palletErrors.innerDocs[error.value.type]?.length)\n throw new Error(\"Unknown error type\")\n\n return palletErrors.innerDocs[error.value.type].join(\" \")\n } catch (err) {\n log.error(\"Failed to parse module error\", { chainId: chain.connector.chainId, error, err })\n return [error.type, error.value.type].join(\": \")\n }\n}\n\nconst tryFormatError = (err: unknown): string => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const unsafeErr = err as any\n if (unsafeErr.type && unsafeErr.value?.type)\n return [unsafeErr.type, unsafeErr.value.type].join(\": \")\n } catch {\n // ignore\n }\n\n return \"Unknown error\"\n}\n","import { toHex } from \"@polkadot-api/utils\"\n\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getRuntimeCallResult = async <T>(\n chain: Chain,\n apiName: string,\n method: string,\n args: unknown[]\n) => {\n const call = chain.builder.buildRuntimeCall(apiName, method)\n\n const hex = await getSendRequestResult<string>(chain, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n}\n","import type { Chain } from \"./types\"\n\nexport const isApiAvailable = (chain: Chain, name: string, method: string) => {\n return chain.metadata.apis.some(\n (a) => a.name === name && a.methods.some((m) => m.name === method)\n )\n}\n","import type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"@polkadot-api/substrate-bindings\"\n\nimport log from \"../log\"\nimport type { DecodedCall } from \"../types\"\nimport { getDispatchErrorMessage } from \"./errors\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { isApiAvailable } from \"./isApiAvailable\"\nimport type { Chain } from \"./types\"\n\ntype DryRunResult = (\n | typeof polkadot\n | typeof polkadotAssetHub\n)[\"descriptors\"][\"apis\"][\"DryRunApi\"][\"dry_run_call\"][1]\n\nexport const getDryRunCall = async <T>(\n chain: Chain,\n from: string,\n decodedCall: DecodedCall<unknown>\n): Promise<\n | {\n available: boolean\n data: null\n ok?: undefined\n errorMessage?: undefined\n }\n | {\n available: boolean\n data: T\n ok: boolean\n errorMessage: string | null\n }\n> => {\n try {\n if (!isApiAvailable(chain, \"DryRunApi\", \"dry_run_call\"))\n return {\n available: false,\n data: null,\n }\n\n const origin = Enum(\"system\", Enum(\"Signed\", from))\n\n const { pallet, method, args } = decodedCall\n const call = { type: pallet, value: { type: method, value: args } }\n\n // This will throw an error if the api is not available on that chain\n const data = await getRuntimeCallResult<DryRunResult>(chain, \"DryRunApi\", \"dry_run_call\", [\n origin,\n call,\n ])\n\n const ok = data.success && data.value.execution_result.success\n const errorMessage =\n data.success && !data.value.execution_result.success\n ? getDispatchErrorMessage(chain, data.value.execution_result.value.error)\n : null\n\n return {\n available: true,\n // NOTE: we can't re-export `@polkadot-api/descriptors` from this package.\n // So, the caller of this function must pass in their own instance of `type DryRunResult` as the generic argument `T`.\n data: data as T,\n ok,\n errorMessage,\n }\n } catch (err) {\n // Note : err is null if chain doesnt have the api\n log.error(\"Failed to dry run\", { chainId: chain.connector.chainId, err })\n return {\n available: false,\n data: null,\n }\n }\n}\n","import { u32, u128 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\n\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// fee estimation fallback for chains that dont have metadata v15 yet\n// (the runtime-call codecs needed to decode this with the dynamic builder require metadata v15)\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n // the full encoded extrinsic, INCLUDING its compact length prefix: the runtime\n // decodes the uxt argument as an opaque length-prefixed UncheckedExtrinsic\n signedTxBytes: Uint8Array\n): Promise<ExtrinsicDispatchInfo> => {\n const args = mergeUint8([signedTxBytes, u32.enc(signedTxBytes.length)])\n\n const result = (await chain.connector.send(\n \"state_call\",\n [\"TransactionPaymentApi_query_info\", toHex(args)],\n true\n )) as `0x${string}`\n\n // RuntimeDispatchInfo = { weight: WeightV1 (u64) | WeightV2 (2x compact), class: enum (1 byte), partial_fee: u128 }\n // the weight shape varies across old runtimes, but partial_fee is always the trailing fixed-size field\n const bytes = fromHex(result)\n if (bytes.length < 16) throw new Error(\"Invalid RuntimeDispatchInfo\")\n // .slice (copy), NOT .subarray: papi codecs read offset views from the buffer start\n const partialFee = u128.dec(bytes.slice(bytes.length - 16))\n\n return {\n partialFee: partialFee.toString(),\n }\n}\n","import { createV4Tx } from \"@polkadot-api/signers-common\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getAddressBytes, isEthereumAddress } from \"./papi\"\nimport type { Chain } from \"./types\"\n\n/** strips the leading compact length prefix from an encoded extrinsic */\nconst stripLengthPrefix = (tx: Uint8Array): Uint8Array => {\n const mode = tx[0] & 3\n const prefixLen = mode === 0 ? 1 : mode === 1 ? 2 : mode === 2 ? 4 : 1 + (tx[0] >> 2) + 4\n return tx.subarray(prefixLen)\n}\n\nexport const getFeeEstimate = async (chain: Chain, payload: SignerPayloadJSON) => {\n // build a fake-signed extrinsic - fees depend on the encoded length, not the signature content\n const { callData, extra } = getPjsTxHelper(chain.hexMetadata, CUSTOM_SIGNED_EXTENSIONS)(payload)\n const fakeSignature = isEthereumAddress(payload.address)\n ? new Uint8Array(65) // AccountId20 chains: raw 65-byte signature, no MultiSignature prefix\n : new Uint8Array(66).fill(2, 0, 1) // MultiSignature ecdsa variant, the longest (type byte + 65) so the length fee is never underestimated\n\n const signedTx = createV4Tx(\n chain.metadata,\n getAddressBytes(payload.address),\n fakeSignature,\n [extra],\n callData\n )\n\n const bytes = stripLengthPrefix(signedTx)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [bytes, bytes.length]\n )\n // Do not throw if partialFee is 0n. This is a valid response, eg: Bittensor remove_stake fee estimation is 0n.\n if (!result?.partial_fee && result.partial_fee !== 0n) {\n throw new Error(\"partialFee is not found\")\n }\n return result.partial_fee\n } catch (err) {\n log.error(\"Failed to get fee estimate using getRuntimeCallValue\", { err })\n }\n\n // fallback to pjs encoded state call, in case the above fails (extracting runtime calls codecs might require metadata V15)\n // Note: PAPI will consider TransactionPaymentApi as first class api so it should work even without V15, but this is not the case yet.\n const { partialFee } = await getExtrinsicDispatchInfo(chain, signedTx)\n\n return BigInt(partialFee)\n}\n","import type { SapiConnectorProps } from \"../types\"\n\nexport type SapiConnector = Required<SapiConnectorProps>\n\nexport const getSapiConnector = ({\n chainId,\n send,\n submit,\n submitWithBittensorMevShield,\n}: SapiConnectorProps): SapiConnector => ({\n chainId,\n send,\n submit: (...args) => {\n if (submit) return submit(...args)\n throw new Error(\"submit handler not provided\")\n },\n submitWithBittensorMevShield: (...args) => {\n if (submitWithBittensorMevShield) return submitWithBittensorMevShield(...args)\n throw new Error(\"submitWithBittensorMevShield handler not provided\")\n },\n})\n","import type { Chain } from \"./types\"\n\nexport const hasConstant = (chain: Chain, pallet: string, constant: string): boolean => {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n return !!palletDef?.constants.some((c) => c.name === constant)\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const hasEvent = (chain: Chain, pallet: string, event: string): boolean => {\n try {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n if (typeof palletDef?.events !== \"number\") return false\n\n const lookup = getLookupFn(chain.metadata)\n const palletEvents = lookup(palletDef.events)\n\n return palletEvents.type === \"enum\" && event in palletEvents.innerDocs\n } catch (err) {\n log.error(\"Failed to check event existence\", { pallet, event, err })\n return false\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { ScaleApiSubmitMode } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const submit = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n): Promise<{ hash: `0x${string}`; innerHash?: `0x${string}` }> => {\n switch (mode) {\n case \"bittensor-mev-shield\":\n if (signature)\n throw new Error(\"Signature should not be provided when using bittensor-mev-shield mode\")\n return chain.connector.submitWithBittensorMevShield(payload, txInfo)\n\n default:\n return chain.connector.submit(payload, signature, txInfo)\n }\n}\n","import { parseMetadataRpc } from \"@talismn/scale\"\nimport { getCallDocs } from \"./helpers/getCallDocs\"\nimport { getChainInfo } from \"./helpers/getChainInfo\"\nimport { getConstantValue } from \"./helpers/getConstantValue\"\nimport { getDecodedCall, getDecodedCallFromPayload } from \"./helpers/getDecodedCall\"\nimport { getDecodedCallFromExtrinsic } from \"./helpers/getDecodedCallFromExtrinsic\"\nimport { getDryRunCall } from \"./helpers/getDryRunCall\"\nimport { getFeeEstimate } from \"./helpers/getFeeEstimate\"\nimport { getRuntimeCallResult } from \"./helpers/getRuntimeCallResult\"\nimport { getSapiConnector } from \"./helpers/getSapiConnector\"\nimport { getSignerPayloadJSON } from \"./helpers/getSignerPayloadJSON\"\nimport { getStorageValue } from \"./helpers/getStorageValue\"\nimport { hasConstant } from \"./helpers/hasConstant\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\nimport type { ExtDef, SignerPayloadJSON } from \"./pjsInterop\"\nimport type {\n DecodedCall,\n PayloadSignerConfig,\n SapiConnectorProps,\n ScaleApiSubmitMode,\n} from \"./types\"\n\nexport type ScaleApi = NonNullable<ReturnType<typeof getScaleApi>>\n\nexport const getScaleApi = (\n connector: SapiConnectorProps,\n hexMetadata: `0x${string}`,\n token: { symbol: string; decimals: number },\n hasCheckMetadataHash?: boolean,\n signedExtensions?: ExtDef,\n registryTypes?: unknown\n) => {\n const { unifiedMetadata: metadata, lookupFn: lookup, builder } = parseMetadataRpc(hexMetadata)\n\n const chain: Chain = {\n connector: getSapiConnector(connector),\n hexMetadata,\n\n token,\n hasCheckMetadataHash,\n signedExtensions,\n registryTypes,\n\n metadata,\n lookup,\n builder,\n metadataRpc: hexMetadata,\n }\n\n const chainInfo = getChainInfo(chain)\n\n const { specName, specVersion, base58Prefix } = chainInfo\n\n return {\n id: `${connector.chainId}::${specName}::${specVersion}`,\n chainId: connector.chainId,\n specName,\n specVersion,\n hasCheckMetadataHash,\n base58Prefix,\n token: chain.token,\n chain,\n\n getConstant: <T>(pallet: string, constant: string) =>\n getConstantValue<T>(chain, pallet, constant),\n\n getStorage: <T>(pallet: string, entry: string, keys: unknown[], at?: string) =>\n getStorageValue<T>(chain, pallet, entry, keys, at),\n\n getDecodedCall: (pallet: string, method: string, args: unknown) =>\n getDecodedCall(pallet, method, args),\n\n getDecodedCallFromPayload: <Res extends DecodedCall>(payload: {\n method: SignerPayloadJSON[\"method\"]\n }) => getDecodedCallFromPayload<Res>(chain, payload),\n\n getDecodedCallFromExtrinsic: <Res extends DecodedCall>(extrinsicHex: `0x${string}`) =>\n getDecodedCallFromExtrinsic<Res>(chain, extrinsicHex),\n\n getExtrinsicPayload: (\n pallet: string,\n method: string,\n args: unknown,\n config: PayloadSignerConfig\n ) => getSignerPayloadJSON(chain, pallet, method, args, config, chainInfo),\n\n getFeeEstimate: (payload: SignerPayloadJSON) => getFeeEstimate(chain, payload),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n submit: (\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n ) => submit(chain, payload, signature, txInfo, mode),\n\n getCallDocs: (pallet: string, method: string) => getCallDocs(chain, pallet, method),\n\n getDryRunCall: <T>(from: string, decodedCall: DecodedCall<unknown>) =>\n getDryRunCall<T>(chain, from, decodedCall),\n\n isApiAvailable: (name: string, method: string) => isApiAvailable(chain, name, method),\n\n hasEvent: (pallet: string, event: string) => hasEvent(chain, pallet, event),\n\n hasConstant: (pallet: string, constant: string) => hasConstant(chain, pallet, constant),\n }\n}\n"],"mappings":";;;;;;;;;;AAKA,MAAM,wBAAQ,IAAI,WAAW;;;;AAK7B,MAAa,2BAAmD,EAE9D,aAAa,EAAE,iBAAiB;CAC9B,MAAM,QAAQ,OAAQ,WAAmC,SAAS,CAAC;CACnE,OAAO;EACL,OAAO,cAAc,IAAI,OAAO,SAAS,KAAK,IAAI,QAAQ,CAAC;EAC3D,kBAAkB;CACpB;AACF,EACF;;;AChBA,MAAM,eAAe;AAGrB,MAAa,iCAAiC;;;;;;;AAU9C,MAAa,oBAAoB,OAC/B,SACA,wBAC2B;CAC3B,IAAI;EAEF,MAAM,mBAAmB,MAAM,QAC7B,cACA,CAAC,8BAA8B,IAAI,GACnC,IACF;EACA,MAAM,oBAAoB,OAAOA,KAAG,CAAC,CAAC,IAAI,gBAAgB;EAC1D,MAAM,cAAc,KAAK,IACvB,GAAG,kBAAkB,QAAQ,MAAM,KAAA,EAAmC,CACxE;EAEA,MAAM,WAAW,MAAM,QACrB,cACA,CAAC,gCAAgC,MAAMA,MAAI,IAAI,WAAW,CAAC,CAAC,GAC5D,IACF;EAEA,OAAO,kBAAkB,QAAQ;CACnC,SAAS,OAAO;EAEd,MAAM,UAAW,OAAgC;EACjD,IACE,uBACA,SAAS,SAAS,cAAc,KAChC,SAAS,SAAS,uDAAuD,KACzE,SAAS,SAAS,yDAAyD,KAC3E,SAAS,SAAS,uDAAuD,GAEzE,OAAQ,MAAM,QAAQ,qBAAqB,CAAC,GAAG,IAAI;EAIrD,MAAM,IAAI,MAAM,4BAA4B,EAAE,MAAM,CAAC;CACvD;AACF;;;;;AAMA,MAAM,qBAAqB,aAA2C;CACpE,MAAM,iBAAiB,MAAMA,MAAI,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;CAE3D,MAAM,mBAAmB,SAAS,QAAQ,cAAc;CACxD,IAAI,qBAAqB,IAAI,MAAM,IAAI,MAAM,iDAAiD;CAE9F,OAAO,KAAK,SAAS,MAAM,gBAAgB;AAC7C;;;AEhEA,IAAA,cAAe,UAAUC,eAAgB;;;ACIzC,MAAa,8BACX,OACA,WACA,YAC4D;CAC5D,IAAI,CAAC,MAAM,wBAAwB,CAAC,QAAQ,iBAAiB,SAAS,mBAAmB,GACvF,OAAO;EACL;EACA,YAAY,KAAA;CACd;CAEF,IAAI;EACF,MAAM,EAAE,UAAU,QAAQ,gBAAgB,MAAM;EAChD,MAAM,EAAE,cAAc,UAAU,gBAAgB;EAChD,MAAM,qBAAqB;GAAE;GAAa;GAAU;GAAc;GAAU;EAAY;EAGxF,MAAM,qBAAqB,kBAAkB,MAAM,aAAa,kBAAkB;EAClF,MAAM,eAAe,MAAM,mBAAmB,OAAO,CAAC;EACtD,YAAI,IAAI,gBAAgB,cAAc,kBAAkB;EAExD,MAAM,0BAA0B;GAC9B,GAAG;GACH,MAAM;GACN;GACA,uBAAuB;EACzB;EAEA,MAAM,EAAE,UAAU,OAAO,qBAAqBC,iBAC5C,MAAM,aACN,wBACF,CAAC,CAAC,uBAAuB;EACzB,MAAM,cAAc,WAAW;GAAC;GAAU;GAAO;EAAgB,CAAC;EAIlE,OAAO;GACL,SAAS;GACT,YAJiB,mBAAmB,4BAA4B,WAIvD;EACX;CACF,SAAS,KAAK;EACZ,YAAI,MAAM,oCAAoC,EAAE,OAAO,IAAI,CAAC;EAC5D,OAAO;GACL;GACA,YAAY,KAAA;EACd;CACF;AACF;;;ACrDA,MAAa,wBACX,OACA,QACA,QACA,gBACiB;CACjB,OAAO,MAAM,UAAU,KAAK,QAAQ,QAAQ,WAAW;AACzD;;;ACNA,MAAa,kBAAkB,OAC7B,OACA,QACA,OACA,MACA,OACG;CACH,MAAM,eAAe,MAAM,QAAQ,aAAa,QAAQ,KAAK;CAC7D,MAAM,WAAW,aAAa,KAAK,IAAI,GAAG,IAAI;CAE9C,MAAM,WAAW,MAAM,qBAAoC,OAAO,oBAAoB,CACpF,UACA,EACF,CAAC;CACD,IAAI,CAAC,UAAU,OAAO;CAEtB,OAAO,aAAa,MAAM,IAAI,QAAQ;AACxC;;;ACbA,MAAa,YAAY,OAAwB,eAAwB;CACvE,IAAI,QAAQ,MAAM,SAAS,EAAE;CAC7B,SAAS,MAAM,SAAS,IAAI,MAAM,MAAM;CACxC,MAAM,eAAe,KAAK,IAAI,IAAI,cAAc,KAAK,MAAM,SAAS,CAAC;CACrE,OAAO,KAAK,KAAK,OAAO,YAAY,IAAI;AAC1C;AAEA,MAAa,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC,MAAM,UAA6C;CAC/F,MAAM,SAAS,KAAK,IAAI,MAAM,UAAU,IAAI,CAAC;CAC7C,MAAM,OAAO,KAAK,IAAI,KAAK,IAAI,eAAe,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;CACvE,MAAM,QAAS,MAAM,QAAQ,UAAW;CACxC,OAAO,IAAI,IAAI,OAAO,KAAK;AAC7B,CAAC;AAED,SAAS,eAAe,GAAW;CACjC,IAAI,IAAI;CACR,OAAO,EAAE,IAAI,IAAI;EACf;EACA,MAAM;CACR;CACA,OAAO;AACT;AAEA,MAAa,qBAAqB,YAAoB,sBAAsB,KAAK,OAAO;;AAGxF,MAAa,mBAAmB,YAAgC;CAC9D,IAAI,kBAAkB,OAAO,GAAG,OAAO,QAAQ,OAAO;CACtD,MAAM,OAAO,mBAAmB,OAAO;CACvC,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,oBAAoB,SAAS;CAChE,OAAO,KAAK;AACd;;;;AC1BA,MAAa,aAAa;AAE1B,MAAa,uBAAuB,OAClC,OACA,YACA,YACA,MACA,cACA,cAKI;CACJ,MAAM,EAAE,OAAO,aAAa,MAAM,QAAQ,UAAU,YAAY,UAAU;CAC1E,MAAM,SAAS,WAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC;CAIrE,IAAI,YAAY,MAAM,qBACpB,OACA,0BACA,CAAC,GACD,KACF;CAEA,MAAM,CAAC,OAAO,aAAa,sBAAsB,sBAAsB,MAAM,QAAQ,IAAI;EACvF,qBAA6B,OAAO,2BAA2B,CAAC,aAAa,OAAO,GAAG,KAAK;EAC5F,gBAA+B,OAAO,UAAU,aAAa,CAAC,CAAC,CAAC;EAChE,gBAAwB,OAAO,UAAU,UAAU,CAAC,GAAG,SAAS;EAChE,gBAAwB,OAAO,UAAU,UAAU,CAAC,CAAC;CACvD,CAAC;CACD,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,wBAAwB;CAC1D,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,sBAAsB;CAEtD,IAAI,cAAc;CAKlB,IAAI,qBAAqB,uBAAuB,IAAI;EAClD,cAAc,qBAAqB;EAKnC,YAAY,MAHe,gBAA+B,OAAO,UAAU,aAAa,CACtF,WACF,CAAC;CAEH;CAEA,MAAM,MAAM,OAAO;EAAE,QAAA;EAAoB,OAAO,cAAA;CAAyB,CAAC;CAE1E,MAAM,oBAAoB,MAAM,SAAS,UAAU,iBAAiB,MAAM,CAAC,EAAA,CAAG,KAC3E,QAAQ,IAAI,UACf;CAEA,MAAM,cAAiC;EACrC,SAAS,aAAa;EACtB;EACA;EACA,QAAQ,OAAO,MAAM,MAAM;EAC3B;EACA,OAAO,SAAS,OAAO,CAAC;EACxB,aAAa,SAAS,UAAU,aAAa,CAAC;EAC9C,oBAAoB,SAAS,UAAU,oBAAoB,CAAC;EAC5D,aAAa,SAAS,aAAa,CAAC;EACpC,KAAK,MAAM,GAAG;EACd,KAAK,SAAS,GAAG,EAAE;EACnB,SAAS,KAAA;EACT,SAAS;CACX;CAEA,MAAM,EAAE,SAAS,eAAe,2BAA2B,OAAO,WAAW,WAAW;CACxF,MAAM,gBAAgB,aAAc,MAAM,UAAU,IAAsB,KAAA;CAG1E,IAAI,QAAQ,iBAAiB,SAAS,YAAY,GAChD,QAAmD,QAAQ;CAE7D,YAAI,IAAI,kBAAkB;EAAE,YAAY;EAAS;CAAW,CAAC;CAE7D,OAAO;EACL;EACA;EACA;CACF;AACF;;;AC9FA,MAAa,eAAe,OAAc,QAAgB,WAAkC;CAC1F,IAAI;EACF,MAAM,cAAc,MAAM,SAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,MAAM,CAAC,EAAE,OAAO;EACvF,IAAI,CAAC,aAAa,OAAO;EAGzB,IAAI,cAAmB,MAAM,SAAS,OAAO;EAC7C,IAAI,CAAC,eAAe,YAAY,OAAO,aACrC,cAAc,MAAM,SAAS,OAAO,MAAM,MAAM,EAAE,OAAO,WAAW;EAEtE,IAAI,CAAC,aAAa,OAAO;EAMzB,OAJa,YAAY,IAAI,MAAM,MAChC,MAAgD,EAAE,SAAS,MAGpD,CAAC,EAAE,MAAM,KAAK,IAAI,KAAK;CACnC,QAAQ;EACN,YAAI,MAAM,4BAA4B;GAAE;GAAQ;GAAQ;EAAM,CAAC;EAC/D,OAAO;CACT;AACF;;;ACpBA,MAAa,oBAAuB,OAAc,QAAgB,aAAqB;CACrF,OAAO,6BACL;EACE,SAAS,MAAM;EACf,iBAAiB,MAAM;CACzB,GACA,QACA,QACF;AACF;;;ACJA,MAAa,gBAAgB,UAAiB;CAC5C,MAAM,EACJ,WAAW,UACX,cAAc,aACd,qBAAqB,uBACnB,iBAAgC,OAAO,UAAU,SAAS;CAI9D,OAAO;EACL;EACA;EACA;EACA,cANmB,iBAAyB,OAAO,UAAU,YAMlD;CACb;AACF;;;ACnBA,MAAa,kBAAkB,YAAoB,YAAoB,UAAmB;CACxF,MAAM;CACN,OAAO;EAAE,MAAM;EAAY,OAAO;CAAK;AACzC;AAEA,MAAa,6BACX,OACA,YACQ;CAER,MAAM,UADM,MAAM,QAAQ,gBAAgB,MAAM,OAAO,IACrC,CAAC,CAAC,IAAI,QAAQ,MAAM;CAEtC,OAAO;EACL,QAAQ,QAAQ;EAChB,QAAQ,QAAQ,MAAM;EACtB,MAAM,QAAQ,MAAM;CACtB;AACF;;;ACPA,MAAM,cAAc,MAAM,QAAQ,CAAC,CAAC;;;;;;;;;AAUpC,MAAa,+BACX,OACA,iBACe;CACf,IAAI;EACF,MAAM,EAAE,UAAU,YAAY;EAI9B,MAAM,kBAAkB,SAAS,UAAU,iBAAiB,MAAM,CAAC;EACnE,MAAM,WAAW,OAAO,IACtB,OAAO,YACL,gBAAgB,KAAK,MAAM,CAAC,EAAE,YAAY,QAAQ,gBAAgB,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAC/E,CACF;EAGA,IAAI;EACJ,MAAM,EAAE,cAAc;EACtB,IAAI,aAAa,WAEf,UAAU,QAAQ,gBAAgB,UAAU,IAAI,CAAC,CAAC;OAC7C;GAGL,MAAM,YADS,SAAS,OAAO,UAAU,KAAK,EAAE,OAAA,EACvB,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE;GACzD,IAAI,YAAY,MAAM,MAAM,IAAI,MAAM,iCAAiC;GACvE,UAAU,QAAQ,gBAAgB,QAAQ,CAAC,CAAC;EAC9C;EAGA,IAAI;EACJ,IAAI;EACJ,IAAI,aAAa,WAAW;GAE1B,aAAa,QAAQ,gBAAgB,UAAU,OAAO,CAAC,CAAC;GACxD,eAAe,QAAQ,gBAAgB,UAAU,SAAS,CAAC,CAAC;EAC9D,OAAO;GAEL,MAAM,SAAS,SAAS,OAAO,UAAU,KAAK,EAAE;GAChD,MAAM,WAAW,QAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC,EAAE;GAC5D,MAAM,UAAU,QAAQ,MAAM,MAAM,EAAE,SAAS,WAAW,CAAC,EAAE;GAC7D,IAAI,YAAY,QAAQ,WAAW,MACjC,MAAM,IAAI,MAAM,qCAAqC;GACvD,aAAa,QAAQ,gBAAgB,QAAQ,CAAC,CAAC;GAC/C,eAAe,QAAQ,gBAAgB,OAAO,CAAC,CAAC;EAClD;EAGA,MAAM,SAAS,OAAO,IAAI;GACxB,SAAS;GACT,WAAW;GACX,OAAO;GACP,UAAU;EACZ,CAAC;EAkCD,MAAM,UA/BmB,eACvB,eAAe,SAAS;GACtB,MAAM,MAAM,cAAc,IAAI,IAAI;GAClC,MAAM,EAAE,MAAM,YAAY,gBAAgB,EAAE,CAAC,IAAI;GAEjD,IAAI,SAAS,QACX,OAAO;IAAE;IAAK;IAAS;IAAM,UAAU,YAAY,IAAI;GAAE;GAE3D,IAAI,SAAS,UACX,OAAO;IAAE;IAAK;IAAS;IAAM,GAAG,OAAO,IAAI;GAAE;GAM/C,OAAO;IACL;IACA;IACA;IACA,kBANuB,GAAG,IAAI,IAMf;IACf,OANY,SAAS,IAMjB;IACJ,UAAU,YAAY,IAAI;GAC5B;EACF,CAAC,IACA,OAAO;GACN,GAAG;GACH,MAAM,QAAQ,EAAE,QAAQ;EAC1B,EAI6B,CAAC,CAAC,YAAY;EAE7C,OAAO;GACL,QAAQ,QAAQ,KAAK;GACrB,QAAQ,QAAQ,KAAK,MAAM;GAC3B,MAAM,QAAQ,KAAK,MAAM;EAC3B;CACF,SAAS,KAAK;EAEZ,QAAQ,MAAM,sCAAsC,GAAG;EACvD,OAAO;CACT;AACF;;;ACxHA,MAAa,2BAA2B,OAAc,QAAgC;CACpF,IAAI;EACF,IAAI,CAAC,KAAK,OAAO;EAEjB,MAAM,QAAQ;EACd,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,MAAM,wBAAwB;EAEzD,MAAM,MAAM,eAAe,MAAM;EACjC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,wBAAwB;EAClD,IAAI,QAAQ,uBACV,OAAO,sBAAsB,OAAO,MAAM,KAA0B;EACtE,IAAI,OAAO,QAAQ,UAAU,OAAO;EAEpC,MAAM,MAAM,IAAI,MAAM,OAAO;EAC7B,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,wBAAwB;EAClD,IAAI,OAAO,QAAQ,UAAU,OAAO;EAEpC,MAAM,IAAI,MAAM,wBAAwB;CAC1C,SAAS,OAAO;EACd,YAAI,MAAM,iCAAiC;GAAE,SAAS,MAAM,UAAU;GAAS;GAAO;EAAI,CAAC;EAC3F,OAAO,eAAe,GAAG;CAC3B;AACF;AAEA,MAAM,wBAAwB;AAkC9B,MAAM,iBAAiB;CACrB,cAAc;CACd,WAAW;CACX,QAAQ;CACR,mBAAmB;CACnB,aAAa;CACb,kBAAkB;CAClB,OAAO;EA3BP,kBAAkB;EAClB,cAAc;EACd,cAAc;EACd,cAAc;EACd,cAAc;EACd,QAAQ;EACR,aAAa;EACb,kBAAkB;EAClB,eAAe;EACf,SAAS;CAkBS;CAClB,YAAY;EAdZ,UAAU;EACV,WAAW;EACX,gBAAgB;CAYY;CAC5B,eAAe;EAnCf,cAAc;EACd,SAAS;CAkCyB;CAClC,WAAW;CACX,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,MAAM;CACN,OAAO;AACT;AAyBA,MAAM,yBAAyB,OAAc,UAAqC;CAChF,IAAI;EACF,IAAI,CAAC,MAAM,UAAU,MAAM,IAAI,MAAM,0BAA0B;EAE/D,MAAM,SAAS,MAAM,SAAS,QAAQ,MAAM,MAAM,EAAE,SAAS,MAAM,IAAI;EACvE,IAAI,OAAO,QAAQ,WAAW,UAAU,MAAM,IAAI,MAAM,gBAAgB;EAIxE,MAAM,eAFS,YAAY,MAAM,QAEP,CAAC,CAAC,OAAO,MAAM;EACzC,IAAI,aAAa,SAAS,UAAU,CAAC,aAAa,UAAU,MAAM,MAAM,KAAK,EAAE,QAC7E,MAAM,IAAI,MAAM,oBAAoB;EAEtC,OAAO,aAAa,UAAU,MAAM,MAAM,KAAK,CAAC,KAAK,GAAG;CAC1D,SAAS,KAAK;EACZ,YAAI,MAAM,gCAAgC;GAAE,SAAS,MAAM,UAAU;GAAS;GAAO;EAAI,CAAC;EAC1F,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI;CACjD;AACF;AAEA,MAAM,kBAAkB,QAAyB;CAC/C,IAAI;EAEF,MAAM,YAAY;EAClB,IAAI,UAAU,QAAQ,UAAU,OAAO,MACrC,OAAO,CAAC,UAAU,MAAM,UAAU,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI;CAC3D,QAAQ,CAER;CAEA,OAAO;AACT;;;AClIA,MAAa,uBAAuB,OAClC,OACA,SACA,QACA,SACG;CACH,MAAM,OAAO,MAAM,QAAQ,iBAAiB,SAAS,MAAM;CAE3D,MAAM,MAAM,MAAM,qBAA6B,OAAO,cAAc,CAClE,GAAG,QAAQ,GAAG,UACd,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,CAC3B,CAAC;CAED,OAAO,KAAK,MAAM,IAAI,GAAG;AAC3B;;;ACjBA,MAAa,kBAAkB,OAAc,MAAc,WAAmB;CAC5E,OAAO,MAAM,SAAS,KAAK,MACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,QAAQ,MAAM,MAAM,EAAE,SAAS,MAAM,CACnE;AACF;;;ACSA,MAAa,gBAAgB,OAC3B,OACA,MACA,gBAcG;CACH,IAAI;EACF,IAAI,CAAC,eAAe,OAAO,aAAa,cAAc,GACpD,OAAO;GACL,WAAW;GACX,MAAM;EACR;EAEF,MAAM,SAAS,KAAK,UAAU,KAAK,UAAU,IAAI,CAAC;EAElD,MAAM,EAAE,QAAQ,QAAQ,SAAS;EAIjC,MAAM,OAAO,MAAM,qBAAmC,OAAO,aAAa,gBAAgB,CACxF,QACA;GALa,MAAM;GAAQ,OAAO;IAAE,MAAM;IAAQ,OAAO;GAAK;EAK3D,CACL,CAAC;EAQD,OAAO;GACL,WAAW;GAGL;GACN,IAXS,KAAK,WAAW,KAAK,MAAM,iBAAiB;GAYrD,cAVA,KAAK,WAAW,CAAC,KAAK,MAAM,iBAAiB,UACzC,wBAAwB,OAAO,KAAK,MAAM,iBAAiB,MAAM,KAAK,IACtE;EASN;CACF,SAAS,KAAK;EAEZ,YAAI,MAAM,qBAAqB;GAAE,SAAS,MAAM,UAAU;GAAS;EAAI,CAAC;EACxE,OAAO;GACL,WAAW;GACX,MAAM;EACR;CACF;AACF;;;AC9DA,MAAa,2BAA2B,OACtC,OAGA,kBACmC;CACnC,MAAM,OAAO,WAAW,CAAC,eAAe,IAAI,IAAI,cAAc,MAAM,CAAC,CAAC;CAEtE,MAAM,SAAU,MAAM,MAAM,UAAU,KACpC,cACA,CAAC,oCAAoC,MAAM,IAAI,CAAC,GAChD,IACF;CAIA,MAAM,QAAQ,QAAQ,MAAM;CAC5B,IAAI,MAAM,SAAS,IAAI,MAAM,IAAI,MAAM,6BAA6B;CAIpE,OAAO,EACL,YAHiB,KAAK,IAAI,MAAM,MAAM,MAAM,SAAS,EAAE,CAGlC,CAAC,CAAC,SAAS,EAClC;AACF;;;;ACxBA,MAAM,qBAAqB,OAA+B;CACxD,MAAM,OAAO,GAAG,KAAK;CACrB,MAAM,YAAY,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,SAAS,IAAI,IAAI,KAAK,GAAG,MAAM,KAAK;CACxF,OAAO,GAAG,SAAS,SAAS;AAC9B;AAEA,MAAa,iBAAiB,OAAO,OAAc,YAA+B;CAEhF,MAAM,EAAE,UAAU,UAAUC,iBAAe,MAAM,aAAa,wBAAwB,CAAC,CAAC,OAAO;CAC/F,MAAM,gBAAgB,kBAAkB,QAAQ,OAAO,oBACnD,IAAI,WAAW,EAAE,qBACjB,IAAI,WAAW,EAAE,EAAA,CAAE,KAAK,GAAG,GAAG,CAAC;CAEnC,MAAM,WAAW,WACf,MAAM,UACN,gBAAgB,QAAQ,OAAO,GAC/B,eACA,CAAC,KAAK,GACN,QACF;CAEA,MAAM,QAAQ,kBAAkB,QAAQ;CAExC,IAAI;EACF,MAAM,SAAS,MAAM,qBACnB,OACA,yBACA,cACA,CAAC,OAAO,MAAM,MAAM,CACtB;EAEA,IAAI,CAAC,QAAQ,eAAe,OAAO,gBAAgB,IACjD,MAAM,IAAI,MAAM,yBAAyB;EAE3C,OAAO,OAAO;CAChB,SAAS,KAAK;EACZ,YAAI,MAAM,wDAAwD,EAAE,IAAI,CAAC;CAC3E;CAIA,MAAM,EAAE,eAAe,MAAM,yBAAyB,OAAO,QAAQ;CAErE,OAAO,OAAO,UAAU;AAC1B;;;ACnDA,MAAa,oBAAoB,EAC/B,SACA,MACA,QACA,oCACwC;CACxC;CACA;CACA,SAAS,GAAG,SAAS;EACnB,IAAI,QAAQ,OAAO,OAAO,GAAG,IAAI;EACjC,MAAM,IAAI,MAAM,6BAA6B;CAC/C;CACA,+BAA+B,GAAG,SAAS;EACzC,IAAI,8BAA8B,OAAO,6BAA6B,GAAG,IAAI;EAC7E,MAAM,IAAI,MAAM,mDAAmD;CACrE;AACF;;;AClBA,MAAa,eAAe,OAAc,QAAgB,aAA8B;CAEtF,OAAO,CAAC,CADU,MAAM,SAAS,QAAQ,MAAM,MAAM,EAAE,SAAS,MAC/C,CAAC,EAAE,UAAU,MAAM,MAAM,EAAE,SAAS,QAAQ;AAC/D;;;ACAA,MAAa,YAAY,OAAc,QAAgB,UAA2B;CAChF,IAAI;EACF,MAAM,YAAY,MAAM,SAAS,QAAQ,MAAM,MAAM,EAAE,SAAS,MAAM;EACtE,IAAI,OAAO,WAAW,WAAW,UAAU,OAAO;EAGlD,MAAM,eADS,YAAY,MAAM,QACP,CAAC,CAAC,UAAU,MAAM;EAE5C,OAAO,aAAa,SAAS,UAAU,SAAS,aAAa;CAC/D,SAAS,KAAK;EACZ,YAAI,MAAM,mCAAmC;GAAE;GAAQ;GAAO;EAAI,CAAC;EACnE,OAAO;CACT;AACF;;;ACdA,MAAa,SAAS,OACpB,OACA,SACA,WACA,QACA,SACgE;CAChE,QAAQ,MAAR;EACE,KAAK;GACH,IAAI,WACF,MAAM,IAAI,MAAM,uEAAuE;GACzF,OAAO,MAAM,UAAU,6BAA6B,SAAS,MAAM;EAErE,SACE,OAAO,MAAM,UAAU,OAAO,SAAS,WAAW,MAAM;CAC5D;AACF;;;ACOA,MAAa,eACX,WACA,aACA,OACA,sBACA,kBACA,kBACG;CACH,MAAM,EAAE,iBAAiB,UAAU,UAAU,QAAQ,YAAY,iBAAiB,WAAW;CAE7F,MAAM,QAAe;EACnB,WAAW,iBAAiB,SAAS;EACrC;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA,aAAa;CACf;CAEA,MAAM,YAAY,aAAa,KAAK;CAEpC,MAAM,EAAE,UAAU,aAAa,iBAAiB;CAEhD,OAAO;EACL,IAAI,GAAG,UAAU,QAAQ,IAAI,SAAS,IAAI;EAC1C,SAAS,UAAU;EACnB;EACA;EACA;EACA;EACA,OAAO,MAAM;EACb;EAEA,cAAiB,QAAgB,aAC/B,iBAAoB,OAAO,QAAQ,QAAQ;EAE7C,aAAgB,QAAgB,OAAe,MAAiB,OAC9D,gBAAmB,OAAO,QAAQ,OAAO,MAAM,EAAE;EAEnD,iBAAiB,QAAgB,QAAgB,SAC/C,eAAe,QAAQ,QAAQ,IAAI;EAErC,4BAAqD,YAE/C,0BAA+B,OAAO,OAAO;EAEnD,8BAAuD,iBACrD,4BAAiC,OAAO,YAAY;EAEtD,sBACE,QACA,QACA,MACA,WACG,qBAAqB,OAAO,QAAQ,QAAQ,MAAM,QAAQ,SAAS;EAExE,iBAAiB,YAA+B,eAAe,OAAO,OAAO;EAE7E,sBAAyB,SAAiB,QAAgB,SACxD,qBAAwB,OAAO,SAAS,QAAQ,IAAI;EAEtD,SACE,SACA,WACA,QACA,SACG,OAAO,OAAO,SAAS,WAAW,QAAQ,IAAI;EAEnD,cAAc,QAAgB,WAAmB,YAAY,OAAO,QAAQ,MAAM;EAElF,gBAAmB,MAAc,gBAC/B,cAAiB,OAAO,MAAM,WAAW;EAE3C,iBAAiB,MAAc,WAAmB,eAAe,OAAO,MAAM,MAAM;EAEpF,WAAW,QAAgB,UAAkB,SAAS,OAAO,QAAQ,KAAK;EAE1E,cAAc,QAAgB,aAAqB,YAAY,OAAO,QAAQ,QAAQ;CACxF;AACF"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["u32","packageJson.name","getPjsTxHelper","getPjsTxHelper"],"sources":["../src/customSignedExtensions.ts","../src/fetchBestMetadata.ts","../package.json","../src/log.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getDryRunCall.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/hasConstant.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts","../src/sapi.ts"],"sourcesContent":["import { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport type { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\n\ntype CustomExtensionMappers = NonNullable<Parameters<typeof getPjsTxHelper>[1]>\n\nconst EMPTY = new Uint8Array()\n\n/**\n * Encoders for chain-specific signed extensions that `@polkadot-api/tx-utils` doesn't know about.\n */\nexport const CUSTOM_SIGNED_EXTENSIONS: CustomExtensionMappers = {\n // Avail app-id; wallet-built payloads default it to 0 (see getSignerPayloadJSON)\n CheckAppId: ({ pjsPayload }) => {\n const appId = Number((pjsPayload as { appId?: unknown }).appId ?? 0)\n return {\n value: compactNumber.enc(Number.isFinite(appId) ? appId : 0),\n additionalSigned: EMPTY,\n }\n },\n}\n","import { toHex } from \"@polkadot-api/utils\"\nimport { u32, Vector } from \"scale-ts\"\n\nconst MAGIC_NUMBER = 1635018093\n\n// it's important to set a max because some chains also return high invalid version numbers in the metadata_versions list (ex on Polkadot, related to JAM?)\nexport const MAX_SUPPORTED_METADATA_VERSION = 15 // v16 sometimes outputs different metadata hashes, ignore v16 until that is fixed in PAPI\n\ntype RpcSendFunc = <T>(method: string, params: unknown[], isCacheable?: boolean) => Promise<T>\n\n/**\n * Fetches the highest supported version of metadata from the chain.\n *\n * @param rpcSend\n * @returns hex-encoded metadata starting with the magic number\n */\nexport const fetchBestMetadata = async (\n rpcSend: RpcSendFunc,\n allowLegacyFallback?: boolean\n): Promise<`0x${string}`> => {\n try {\n // fetch available versions of metadata\n const metadataVersions = await rpcSend<string>(\n \"state_call\",\n [\"Metadata_metadata_versions\", \"0x\"],\n true\n )\n const availableVersions = Vector(u32).dec(metadataVersions)\n const bestVersion = Math.max(\n ...availableVersions.filter((v) => v <= MAX_SUPPORTED_METADATA_VERSION)\n )\n\n const metadata = await rpcSend<`0x${string}`>(\n \"state_call\",\n [\"Metadata_metadata_at_version\", toHex(u32.enc(bestVersion))],\n true\n )\n\n return normalizeMetadata(metadata)\n } catch (cause) {\n // if the chain doesnt support the Metadata pallet, fallback to legacy rpc provided metadata (V14)\n const message = (cause as { message?: string })?.message\n if (\n allowLegacyFallback ||\n message?.includes(\"is not found\") || // ex: crust standalone\n message?.includes(\"Module doesn't have export Metadata_metadata_versions\") || // ex: 3DPass\n message?.includes(\"Exported method Metadata_metadata_versions is not found\") || // ex: sora-polkadot & sora-standalone\n message?.includes(\"Execution, MethodNotFound, Metadata_metadata_versions\") // ex: stafi\n ) {\n return (await rpcSend(\"state_getMetadata\", [], true)) as `0x${string}`\n }\n\n // otherwise throw so it can be handled by the caller\n throw new Error(\"Failed to fetch metadata\", { cause })\n }\n}\n\n/**\n * Removes everything before the magic number in the metadata.\n * This ensures Opaque metadata is usable by pjs\n */\nconst normalizeMetadata = (metadata: `0x${string}`): `0x${string}` => {\n const hexMagicNumber = toHex(u32.enc(MAGIC_NUMBER)).slice(2)\n\n const magicNumberIndex = metadata.indexOf(hexMagicNumber)\n if (magicNumberIndex === -1) throw new Error(\"Invalid metadata format: magic number not found\")\n\n return `0x${metadata.slice(magicNumberIndex)}` as `0x${string}`\n}\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getPayloadWithMetadataHash = (\n chain: Chain,\n chainInfo: ChainInfo,\n payload: SignerPayloadJSON\n): { payload: SignerPayloadJSON; txMetadata?: Uint8Array } => {\n if (!chain.hasCheckMetadataHash || !payload.signedExtensions.includes(\"CheckMetadataHash\"))\n return {\n payload,\n txMetadata: undefined,\n }\n\n try {\n const { decimals, symbol: tokenSymbol } = chain.token\n const { base58Prefix, specName, specVersion } = chainInfo\n const metadataHashInputs = { tokenSymbol, decimals, base58Prefix, specName, specVersion }\n\n // since ultimately this needs a V15 object, would be nice if this accepted one directly as input\n const merkleizedMetadata = merkleizeMetadata(chain.hexMetadata, metadataHashInputs)\n const metadataHash = toHex(merkleizedMetadata.digest()) as `0x${string}`\n log.log(\"metadataHash\", metadataHash, metadataHashInputs)\n\n const payloadWithMetadataHash = {\n ...payload,\n mode: 1,\n metadataHash,\n withSignedTransaction: true,\n }\n\n const { callData, extra, additionalSigned } = getPjsTxHelper(\n chain.hexMetadata,\n CUSTOM_SIGNED_EXTENSIONS\n )(payloadWithMetadataHash)\n const barePayload = mergeUint8([callData, extra, additionalSigned])\n\n const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(barePayload)\n\n return {\n payload: payloadWithMetadataHash,\n txMetadata,\n }\n } catch (err) {\n log.error(\"Failed to get shortened metadata\", { error: err })\n return {\n payload,\n txMetadata: undefined,\n }\n }\n}\n","import type { Chain } from \"./types\"\n\nexport const getSendRequestResult = <Res>(\n chain: Chain,\n method: string,\n params: unknown[],\n isCacheable?: boolean\n): Promise<Res> => {\n return chain.connector.send(method, params, isCacheable) as Promise<Res>\n}\n","import { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getStorageValue = async <T>(\n chain: Chain,\n pallet: string,\n entry: string,\n keys: unknown[],\n at?: string\n) => {\n const storageCodec = chain.builder.buildStorage(pallet, entry)\n const stateKey = storageCodec.keys.enc(...keys)\n\n const hexValue = await getSendRequestResult<string | null>(chain, \"state_getStorage\", [\n stateKey,\n at,\n ])\n if (!hexValue) return null as T // caller will need to expect null when applicable\n\n return storageCodec.value.dec(hexValue) as T\n}\n","import { Bytes, enhanceEncoder, getSs58AddressInfo, u16 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////// Utilities from PAPI /////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const toPjsHex = (value: number | bigint, minByteLen?: number) => {\n let inner = value.toString(16)\n inner = (inner.length % 2 ? \"0\" : \"\") + inner\n const nPaddedBytes = Math.max(0, (minByteLen || 0) - inner.length / 2)\n return `0x${\"00\".repeat(nPaddedBytes)}${inner}` as `0x${string}`\n}\n\nexport const mortal = enhanceEncoder(Bytes(2).enc, (value: { period: number; phase: number }) => {\n const factor = Math.max(value.period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15)\n const right = (value.phase / factor) << 4\n return u16.enc(left | right)\n})\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nexport const isEthereumAddress = (address: string) => /^0x[0-9a-fA-F]{40}$/.test(address)\n\n/** decodes an ss58 or ethereum address into its raw account bytes */\nexport const getAddressBytes = (address: string): Uint8Array => {\n if (isEthereumAddress(address)) return fromHex(address)\n const info = getSs58AddressInfo(address)\n if (!info.isValid) throw new Error(`Invalid address: ${address}`)\n return info.publicKey\n}\n","import { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { PayloadSignerConfig } from \"../types\"\nimport { getPayloadWithMetadataHash } from \"./getPayloadWithMetadataHash\"\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport { getStorageValue } from \"./getStorageValue\"\nimport { mortal, toPjsHex } from \"./papi\"\nimport type { Chain, ChainInfo } from \"./types\"\n\n/** validity period of a signed payload in blocks: the mortal era every payload is built with */\nexport const ERA_PERIOD = 64\n\nexport const getSignerPayloadJSON = async (\n chain: Chain,\n palletName: string,\n methodName: string,\n args: unknown,\n signerConfig: PayloadSignerConfig,\n chainInfo: ChainInfo\n): Promise<{\n payload: SignerPayloadJSON\n txMetadata: Uint8Array | undefined\n shortMetadata: `0x${string}` | undefined\n}> => {\n const { codec, location } = chain.builder.buildCall(palletName, methodName)\n const method = mergeUint8([new Uint8Array(location), codec.enc(args)])\n\n // on unstable networks with lots of forks (ex: westend asset hub as of june 2025),\n // using a finalized block as reference for mortality is necessary for txs to get through\n let blockHash = await getSendRequestResult<`0x${string}`>(\n chain,\n \"chain_getFinalizedHead\",\n [],\n false\n )\n\n const [nonce, genesisHash, blockNumberFinalized, blockNumberCurrent] = await Promise.all([\n getSendRequestResult<number>(chain, \"system_accountNextIndex\", [signerConfig.address], false),\n getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [0]),\n getStorageValue<number>(chain, \"System\", \"Number\", [], blockHash),\n getStorageValue<number>(chain, \"System\", \"Number\", []),\n ])\n if (!genesisHash) throw new Error(\"Genesis hash not found\")\n\n let blockNumber = blockNumberFinalized\n\n // on Autonomys the finalized block hash is wrong (7000 blocks behind),\n // if we use it to craft a tx it will be invalid\n // => if finalized block number is more than 32 blocks behind, use current - 16\n if (blockNumberCurrent - blockNumberFinalized > 32) {\n blockNumber = blockNumberCurrent - 16\n\n const binBlockHash = await getStorageValue<`0x${string}`>(chain, \"System\", \"BlockHash\", [\n blockNumber,\n ])\n blockHash = binBlockHash\n }\n if (!blockHash) throw new Error(\"Block hash not found\")\n\n const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD })\n // signedExtensions is keyed by extension version, 0 is the default\n const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(\n (ext) => ext.identifier\n )\n\n const basePayload: SignerPayloadJSON = {\n address: signerConfig.address,\n genesisHash,\n blockHash,\n method: Binary.toHex(method),\n signedExtensions,\n nonce: toPjsHex(nonce, 4),\n specVersion: toPjsHex(chainInfo.specVersion, 4),\n transactionVersion: toPjsHex(chainInfo.transactionVersion, 4),\n blockNumber: toPjsHex(blockNumber, 4),\n era: toHex(era) as `0x${string}`,\n tip: toPjsHex(0, 16), // TODO gas station (required for Astar)\n assetId: undefined,\n version: 4,\n }\n\n const { payload, txMetadata } = getPayloadWithMetadataHash(chain, chainInfo, basePayload)\n const shortMetadata = txMetadata ? (toHex(txMetadata) as `0x${string}`) : undefined\n\n // Avail support\n if (payload.signedExtensions.includes(\"CheckAppId\"))\n (payload as SignerPayloadJSON & { appId: number }).appId = 0\n\n log.log(\"[sapi] payload\", { newPayload: payload, txMetadata })\n\n return {\n payload,\n txMetadata, // TODO remove\n shortMetadata,\n }\n}\n","import log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getCallDocs = (chain: Chain, pallet: string, method: string): string | null => {\n try {\n const typeIdCalls = chain.metadata.pallets.find(({ name }) => name === pallet)?.calls?.type\n if (!typeIdCalls) return null\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n let palletCalls: any = chain.metadata.lookup[typeIdCalls]\n if (!palletCalls || palletCalls.id !== typeIdCalls)\n palletCalls = chain.metadata.lookup.find((v) => v.id === typeIdCalls)\n\n if (!palletCalls) return null\n\n const call = palletCalls.def.value.find(\n (c: { name: string; docs?: string[] | null }) => c.name === method\n )\n\n return call?.docs?.join(\"\\n\") ?? null\n } catch {\n log.error(\"Failed to find call docs\", { pallet, method, chain })\n return null\n }\n}\n","import { getConstantValueFromMetadata } from \"@talismn/scale\"\n\nimport type { Chain } from \"./types\"\n\nexport const getConstantValue = <T>(chain: Chain, pallet: string, constant: string) => {\n return getConstantValueFromMetadata<T>(\n {\n builder: chain.builder,\n unifiedMetadata: chain.metadata,\n },\n pallet,\n constant\n )\n}\n","import { getConstantValue } from \"./getConstantValue\"\nimport type { Chain } from \"./types\"\n\ntype SystemVersion = {\n spec_name: string\n spec_version: number\n transaction_version: number\n}\n\nexport const getChainInfo = (chain: Chain) => {\n const {\n spec_name: specName,\n spec_version: specVersion,\n transaction_version: transactionVersion,\n } = getConstantValue<SystemVersion>(chain, \"System\", \"Version\")\n\n const base58Prefix = getConstantValue<number>(chain, \"System\", \"SS58Prefix\")\n\n return {\n specName,\n specVersion,\n transactionVersion,\n base58Prefix,\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const getDecodedCall = (palletName: string, methodName: string, args: unknown) => ({\n type: palletName,\n value: { type: methodName, value: args },\n})\n\nexport const getDecodedCallFromPayload = <Res extends DecodedCall>(\n chain: Chain,\n payload: { method: SignerPayloadJSON[\"method\"] }\n): Res => {\n const def = chain.builder.buildDefinition(chain.lookup.call!)\n const decoded = def.dec(payload.method)\n\n return {\n pallet: decoded.type,\n method: decoded.value.type,\n args: decoded.value.value,\n } as Res\n}\n","import {\n Bytes,\n compactNumber,\n createDecoder,\n type Decoder,\n enhanceDecoder,\n extrinsicFormat,\n type StringRecord,\n Struct,\n u8,\n} from \"@polkadot-api/substrate-bindings\"\n\nimport type { DecodedCall } from \"../types\"\nimport type { Chain } from \"./types\"\n\nconst allBytesDec = Bytes(Infinity).dec\n\n/**\n * Decodes a signed extrinsic and extracts the call data.\n * Handles different metadata versions (v14, v15, v16) and extrinsic formats.\n *\n * @param chain - The chain context with metadata and builder\n * @param extrinsicHex - The hex-encoded extrinsic (with 0x prefix)\n * @returns The decoded call with pallet, method, and args, or null if decoding fails\n */\nexport const getDecodedCallFromExtrinsic = <Res extends DecodedCall>(\n chain: Chain,\n extrinsicHex: `0x${string}`\n): Res | null => {\n try {\n const { metadata, builder } = chain\n\n // Build decoder for signed extensions (extra field)\n // signedExtensions is keyed by extension version, 0 is the default\n const extensionsArray = metadata.extrinsic.signedExtensions[0] ?? []\n const extraDec = Struct.dec(\n Object.fromEntries(\n extensionsArray.map((x) => [x.identifier, builder.buildDefinition(x.type)[1]])\n ) as StringRecord<Decoder<unknown>>\n )\n\n // Build call decoder\n let callDec: Decoder<{ type: string; value: { type: string; value: unknown } }>\n const { extrinsic } = metadata\n if (\"address\" in extrinsic) {\n // v15/v16 metadata\n callDec = builder.buildDefinition(extrinsic.call)[1]\n } else {\n // v14 metadata\n const params = metadata.lookup[extrinsic.type]?.params\n const callType = params?.find((v) => v.name === \"Call\")?.type\n if (callType == null) throw new Error(\"Call type not found in metadata\")\n callDec = builder.buildDefinition(callType)[1]\n }\n\n // Build address and signature decoders\n let addressDec: Decoder<unknown>\n let signatureDec: Decoder<unknown>\n if (\"address\" in extrinsic) {\n // v15/v16\n addressDec = builder.buildDefinition(extrinsic.address)[1]\n signatureDec = builder.buildDefinition(extrinsic.signature)[1]\n } else {\n // v14\n const params = metadata.lookup[extrinsic.type]?.params\n const addrType = params?.find((v) => v.name === \"Address\")?.type\n const sigType = params?.find((v) => v.name === \"Signature\")?.type\n if (addrType == null || sigType == null)\n throw new Error(\"Address or Signature type not found\")\n addressDec = builder.buildDefinition(addrType)[1]\n signatureDec = builder.buildDefinition(sigType)[1]\n }\n\n // Build full signed extrinsic body decoder\n const v4Body = Struct.dec({\n address: addressDec,\n signature: signatureDec,\n extra: extraDec,\n callData: allBytesDec,\n })\n\n // Create the full extrinsic decoder\n const extrinsicDecoder = enhanceDecoder(\n createDecoder((data) => {\n const len = compactNumber.dec(data)\n const { type, version } = extrinsicFormat[1](data)\n\n if (type === \"bare\") {\n return { len, version, type, callData: allBytesDec(data) }\n }\n if (type === \"signed\") {\n return { len, version, type, ...v4Body(data) }\n }\n\n // v5 general format\n const extensionVersion = u8.dec(data)\n const extra = extraDec(data)\n return {\n len,\n type,\n version,\n extensionVersion,\n extra,\n callData: allBytesDec(data),\n }\n }),\n (v) => ({\n ...v,\n call: callDec(v.callData),\n })\n )\n\n // Decode the extrinsic\n const decoded = extrinsicDecoder(extrinsicHex)\n\n return {\n pallet: decoded.call.type,\n method: decoded.call.value.type,\n args: decoded.call.value.value,\n } as Res\n } catch (err) {\n // biome-ignore lint/suspicious/noConsole: troubleshoting\n console.error(\"[SAPI] Failed to decode extrinsic:\", err)\n return null\n }\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getDispatchErrorMessage = (chain: Chain, err: unknown): string | null => {\n try {\n if (!err) return null\n\n const error = err as UnsafeDispatchError\n if (!error.type) throw new Error(\"Unknown dispatch error\")\n\n const lv1 = DISPATCH_ERROR[error.type as keyof typeof DISPATCH_ERROR]\n if (!lv1) throw new Error(\"Unknown dispatch error\")\n if (lv1 === ERROR_METADATA_LOOKUP)\n return getModuleErrorMessage(chain, error.value as UnsafeModuleError)\n if (typeof lv1 === \"string\") return lv1\n\n const lv2 = lv1[error.value?.type as keyof typeof lv1]\n if (!lv2) throw new Error(\"Unknown dispatch error\")\n if (typeof lv2 === \"string\") return lv2\n\n throw new Error(\"Unknown dispatch error\")\n } catch (cause) {\n log.error(\"Failed to parse runtime error\", { chainId: chain.connector.chainId, cause, err })\n return tryFormatError(err)\n }\n}\n\nconst ERROR_METADATA_LOOKUP = \"METADATA_LOOKUP\"\n\n// only `Module` errors are part of the metadata\n// errors below are defined as part of the runtime but their docs aren't included in the metadata\n// so those are copy/pasted from the polkadot-sdk repo\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L543\nconst ERRORS_TRANSACTIONAL = {\n LimitReached: \"Too many transactional layers have been spawned\",\n NoLayer: \"A transactional layer was expected, but does not exist\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L672\nconst ERRORS_TOKEN = {\n FundsUnavailable: \"Funds are unavailable\",\n OnlyProvider: \"Account that must exist would die\",\n BelowMinimum: \"Account cannot exist with the funds that would be given\",\n CannotCreate: \"Account cannot be created\",\n UnknownAsset: \"The asset in question is unknown\",\n Frozen: \"Funds exist but are frozen\",\n Unsupported: \"Operation is not supported by the asset\",\n CannotCreateHold: \"Account cannot be created for recording amount on hold\",\n NotExpendable: \"Account that is desired to remain would die\",\n Blocked: \"Account cannot receive the assets\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/arithmetic/src/lib.rs#L76\nconst ERRORS_ARITHMETIC = {\n Overflow: \"An overflow would occur\",\n Underflow: \"An underflow would occur\",\n DivisionByZero: \"Division by zero\",\n}\n\n// https://github.com/paritytech/polkadot-sdk/blob/56d97c3ad8c86e602bc7ac368751210517c4309f/substrate/primitives/runtime/src/lib.rs#L714\nconst DISPATCH_ERROR = {\n CannotLookup: \"Cannot lookup\",\n BadOrigin: \"Bad origin\",\n Module: ERROR_METADATA_LOOKUP,\n ConsumerRemaining: \"Consumer remaining\",\n NoProviders: \"No providers\",\n TooManyConsumers: \"Too many consumers\",\n Token: ERRORS_TOKEN,\n Arithmetic: ERRORS_ARITHMETIC,\n Transactional: ERRORS_TRANSACTIONAL,\n Exhausted: \"Resources exhausted\",\n Corruption: \"State corrupt\",\n Unavailable: \"Resource unavailable\",\n RootNotAllowed: \"Root not allowed\",\n Trie: \"Unknown error\", // unsupported,\n Other: \"Unknown error\", // unsupported,\n}\n\ntype UnsafeDispatchError = {\n type: string\n value:\n | {\n type: string\n value:\n | {\n type: string\n value: undefined\n }\n | undefined\n }\n | undefined\n}\n\ntype UnsafeModuleError = {\n type: string\n value: {\n type: string\n value: undefined\n }\n}\n\nconst getModuleErrorMessage = (chain: Chain, error: UnsafeModuleError): string => {\n try {\n if (!chain.metadata) throw new Error(\"Could not fetch metadata\")\n\n const errorsType = chain.metadata.pallets.find((p) => p.name === error.type)?.errors?.type\n if (typeof errorsType !== \"number\") throw new Error(\"Unknown pallet\")\n\n const lookup = getLookupFn(chain.metadata)\n\n const palletErrors = lookup(errorsType)\n if (palletErrors.type !== \"enum\" || !palletErrors.innerDocs[error.value.type]?.length)\n throw new Error(\"Unknown error type\")\n\n return palletErrors.innerDocs[error.value.type].join(\" \")\n } catch (err) {\n log.error(\"Failed to parse module error\", { chainId: chain.connector.chainId, error, err })\n return [error.type, error.value.type].join(\": \")\n }\n}\n\nconst tryFormatError = (err: unknown): string => {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const unsafeErr = err as any\n if (unsafeErr.type && unsafeErr.value?.type)\n return [unsafeErr.type, unsafeErr.value.type].join(\": \")\n } catch {\n // ignore\n }\n\n return \"Unknown error\"\n}\n","import { toHex } from \"@polkadot-api/utils\"\n\nimport { getSendRequestResult } from \"./getSendRequestResult\"\nimport type { Chain } from \"./types\"\n\nexport const getRuntimeCallResult = async <T>(\n chain: Chain,\n apiName: string,\n method: string,\n args: unknown[]\n) => {\n const call = chain.builder.buildRuntimeCall(apiName, method)\n\n const hex = await getSendRequestResult<string>(chain, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n}\n","import type { Chain } from \"./types\"\n\nexport const isApiAvailable = (chain: Chain, name: string, method: string) => {\n return chain.metadata.apis.some(\n (a) => a.name === name && a.methods.some((m) => m.name === method)\n )\n}\n","import type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"@polkadot-api/substrate-bindings\"\n\nimport log from \"../log\"\nimport type { DecodedCall } from \"../types\"\nimport { getDispatchErrorMessage } from \"./errors\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { isApiAvailable } from \"./isApiAvailable\"\nimport type { Chain } from \"./types\"\n\ntype DryRunResult = (\n | typeof polkadot\n | typeof polkadotAssetHub\n)[\"descriptors\"][\"apis\"][\"DryRunApi\"][\"dry_run_call\"][1]\n\nexport const getDryRunCall = async <T>(\n chain: Chain,\n from: string,\n decodedCall: DecodedCall<unknown>\n): Promise<\n | {\n available: boolean\n data: null\n ok?: undefined\n errorMessage?: undefined\n }\n | {\n available: boolean\n data: T\n ok: boolean\n errorMessage: string | null\n }\n> => {\n try {\n if (!isApiAvailable(chain, \"DryRunApi\", \"dry_run_call\"))\n return {\n available: false,\n data: null,\n }\n\n const origin = Enum(\"system\", Enum(\"Signed\", from))\n\n const { pallet, method, args } = decodedCall\n const call = { type: pallet, value: { type: method, value: args } }\n\n // This will throw an error if the api is not available on that chain\n const data = await getRuntimeCallResult<DryRunResult>(chain, \"DryRunApi\", \"dry_run_call\", [\n origin,\n call,\n ])\n\n const ok = data.success && data.value.execution_result.success\n const errorMessage =\n data.success && !data.value.execution_result.success\n ? getDispatchErrorMessage(chain, data.value.execution_result.value.error)\n : null\n\n return {\n available: true,\n // NOTE: we can't re-export `@polkadot-api/descriptors` from this package.\n // So, the caller of this function must pass in their own instance of `type DryRunResult` as the generic argument `T`.\n data: data as T,\n ok,\n errorMessage,\n }\n } catch (err) {\n // Note : err is null if chain doesnt have the api\n log.error(\"Failed to dry run\", { chainId: chain.connector.chainId, err })\n return {\n available: false,\n data: null,\n }\n }\n}\n","import { u32, u128 } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\n\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// fee estimation fallback for chains that dont have metadata v15 yet\n// (the runtime-call codecs needed to decode this with the dynamic builder require metadata v15)\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n // the full encoded extrinsic, INCLUDING its compact length prefix: the runtime\n // decodes the uxt argument as an opaque length-prefixed UncheckedExtrinsic\n signedTxBytes: Uint8Array\n): Promise<ExtrinsicDispatchInfo> => {\n const args = mergeUint8([signedTxBytes, u32.enc(signedTxBytes.length)])\n\n const result = (await chain.connector.send(\n \"state_call\",\n [\"TransactionPaymentApi_query_info\", toHex(args)],\n true\n )) as `0x${string}`\n\n // RuntimeDispatchInfo = { weight: WeightV1 (u64) | WeightV2 (2x compact), class: enum (1 byte), partial_fee: u128 }\n // the weight shape varies across old runtimes, but partial_fee is always the trailing fixed-size field\n const bytes = fromHex(result)\n if (bytes.length < 16) throw new Error(\"Invalid RuntimeDispatchInfo\")\n // .slice (copy), NOT .subarray: papi codecs read offset views from the buffer start\n const partialFee = u128.dec(bytes.slice(bytes.length - 16))\n\n return {\n partialFee: partialFee.toString(),\n }\n}\n","import { createV4Tx } from \"@polkadot-api/signers-common\"\nimport { getPjsTxHelper } from \"@polkadot-api/tx-utils\"\nimport { CUSTOM_SIGNED_EXTENSIONS } from \"../customSignedExtensions\"\nimport log from \"../log\"\nimport type { SignerPayloadJSON } from \"../pjsInterop\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getAddressBytes, isEthereumAddress } from \"./papi\"\nimport type { Chain } from \"./types\"\n\n/** strips the leading compact length prefix from an encoded extrinsic */\nconst stripLengthPrefix = (tx: Uint8Array): Uint8Array => {\n const mode = tx[0] & 3\n const prefixLen = mode === 0 ? 1 : mode === 1 ? 2 : mode === 2 ? 4 : 1 + (tx[0] >> 2) + 4\n return tx.subarray(prefixLen)\n}\n\nexport const getFeeEstimate = async (chain: Chain, payload: SignerPayloadJSON) => {\n // build a fake-signed extrinsic - fees depend on the encoded length, not the signature content\n const { callData, extra } = getPjsTxHelper(chain.hexMetadata, CUSTOM_SIGNED_EXTENSIONS)(payload)\n const fakeSignature = isEthereumAddress(payload.address)\n ? new Uint8Array(65) // AccountId20 chains: raw 65-byte signature, no MultiSignature prefix\n : new Uint8Array(66).fill(2, 0, 1) // MultiSignature ecdsa variant, the longest (type byte + 65) so the length fee is never underestimated\n\n const signedTx = createV4Tx(\n chain.metadata,\n getAddressBytes(payload.address),\n fakeSignature,\n [extra],\n callData\n )\n\n const bytes = stripLengthPrefix(signedTx)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [bytes, signedTx.length]\n )\n // Do not throw if partialFee is 0n. This is a valid response, eg: Bittensor remove_stake fee estimation is 0n.\n if (!result?.partial_fee && result.partial_fee !== 0n) {\n throw new Error(\"partialFee is not found\")\n }\n return result.partial_fee\n } catch (err) {\n log.error(\"Failed to get fee estimate using getRuntimeCallValue\", { err })\n }\n\n // fallback to pjs encoded state call, in case the above fails (extracting runtime calls codecs might require metadata V15)\n // Note: PAPI will consider TransactionPaymentApi as first class api so it should work even without V15, but this is not the case yet.\n const { partialFee } = await getExtrinsicDispatchInfo(chain, signedTx)\n\n return BigInt(partialFee)\n}\n","import type { SapiConnectorProps } from \"../types\"\n\nexport type SapiConnector = Required<SapiConnectorProps>\n\nexport const getSapiConnector = ({\n chainId,\n send,\n submit,\n submitWithBittensorMevShield,\n}: SapiConnectorProps): SapiConnector => ({\n chainId,\n send,\n submit: (...args) => {\n if (submit) return submit(...args)\n throw new Error(\"submit handler not provided\")\n },\n submitWithBittensorMevShield: (...args) => {\n if (submitWithBittensorMevShield) return submitWithBittensorMevShield(...args)\n throw new Error(\"submitWithBittensorMevShield handler not provided\")\n },\n})\n","import type { Chain } from \"./types\"\n\nexport const hasConstant = (chain: Chain, pallet: string, constant: string): boolean => {\n const palletDef = chain.metadata.pallets.find((p) => p.name === pallet)\n return !!palletDef?.constants.some((c) => c.name === constant)\n}\n","import { getLookupFn } from \"@polkadot-api/metadata-builders\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const hasEvent = (chain: Chain, pallet: string, event: string): boolean => {\n try {\n const eventsType = chain.metadata.pallets.find((p) => p.name === pallet)?.events?.type\n if (typeof eventsType !== \"number\") return false\n\n const lookup = getLookupFn(chain.metadata)\n const palletEvents = lookup(eventsType)\n\n return palletEvents.type === \"enum\" && event in palletEvents.innerDocs\n } catch (err) {\n log.error(\"Failed to check event existence\", { pallet, event, err })\n return false\n }\n}\n","import type { SignerPayloadJSON } from \"../pjsInterop\"\nimport type { ScaleApiSubmitMode } from \"../types\"\nimport type { Chain } from \"./types\"\n\nexport const submit = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n): Promise<{ hash: `0x${string}`; innerHash?: `0x${string}` }> => {\n switch (mode) {\n case \"bittensor-mev-shield\":\n if (signature)\n throw new Error(\"Signature should not be provided when using bittensor-mev-shield mode\")\n return chain.connector.submitWithBittensorMevShield(payload, txInfo)\n\n default:\n return chain.connector.submit(payload, signature, txInfo)\n }\n}\n","import { parseMetadataRpc } from \"@talismn/scale\"\nimport { getCallDocs } from \"./helpers/getCallDocs\"\nimport { getChainInfo } from \"./helpers/getChainInfo\"\nimport { getConstantValue } from \"./helpers/getConstantValue\"\nimport { getDecodedCall, getDecodedCallFromPayload } from \"./helpers/getDecodedCall\"\nimport { getDecodedCallFromExtrinsic } from \"./helpers/getDecodedCallFromExtrinsic\"\nimport { getDryRunCall } from \"./helpers/getDryRunCall\"\nimport { getFeeEstimate } from \"./helpers/getFeeEstimate\"\nimport { getRuntimeCallResult } from \"./helpers/getRuntimeCallResult\"\nimport { getSapiConnector } from \"./helpers/getSapiConnector\"\nimport { getSignerPayloadJSON } from \"./helpers/getSignerPayloadJSON\"\nimport { getStorageValue } from \"./helpers/getStorageValue\"\nimport { hasConstant } from \"./helpers/hasConstant\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\nimport type { ExtDef, SignerPayloadJSON } from \"./pjsInterop\"\nimport type {\n DecodedCall,\n PayloadSignerConfig,\n SapiConnectorProps,\n ScaleApiSubmitMode,\n} from \"./types\"\n\nexport type ScaleApi = NonNullable<ReturnType<typeof getScaleApi>>\n\nexport const getScaleApi = (\n connector: SapiConnectorProps,\n hexMetadata: `0x${string}`,\n token: { symbol: string; decimals: number },\n hasCheckMetadataHash?: boolean,\n signedExtensions?: ExtDef,\n registryTypes?: unknown\n) => {\n const { unifiedMetadata: metadata, lookupFn: lookup, builder } = parseMetadataRpc(hexMetadata)\n\n const chain: Chain = {\n connector: getSapiConnector(connector),\n hexMetadata,\n\n token,\n hasCheckMetadataHash,\n signedExtensions,\n registryTypes,\n\n metadata,\n lookup,\n builder,\n metadataRpc: hexMetadata,\n }\n\n const chainInfo = getChainInfo(chain)\n\n const { specName, specVersion, base58Prefix } = chainInfo\n\n return {\n id: `${connector.chainId}::${specName}::${specVersion}`,\n chainId: connector.chainId,\n specName,\n specVersion,\n hasCheckMetadataHash,\n base58Prefix,\n token: chain.token,\n chain,\n\n getConstant: <T>(pallet: string, constant: string) =>\n getConstantValue<T>(chain, pallet, constant),\n\n getStorage: <T>(pallet: string, entry: string, keys: unknown[], at?: string) =>\n getStorageValue<T>(chain, pallet, entry, keys, at),\n\n getDecodedCall: (pallet: string, method: string, args: unknown) =>\n getDecodedCall(pallet, method, args),\n\n getDecodedCallFromPayload: <Res extends DecodedCall>(payload: {\n method: SignerPayloadJSON[\"method\"]\n }) => getDecodedCallFromPayload<Res>(chain, payload),\n\n getDecodedCallFromExtrinsic: <Res extends DecodedCall>(extrinsicHex: `0x${string}`) =>\n getDecodedCallFromExtrinsic<Res>(chain, extrinsicHex),\n\n getExtrinsicPayload: (\n pallet: string,\n method: string,\n args: unknown,\n config: PayloadSignerConfig\n ) => getSignerPayloadJSON(chain, pallet, method, args, config, chainInfo),\n\n getFeeEstimate: (payload: SignerPayloadJSON) => getFeeEstimate(chain, payload),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n submit: (\n payload: SignerPayloadJSON,\n signature?: `0x${string}`,\n txInfo?: unknown,\n mode?: ScaleApiSubmitMode\n ) => submit(chain, payload, signature, txInfo, mode),\n\n getCallDocs: (pallet: string, method: string) => getCallDocs(chain, pallet, method),\n\n getDryRunCall: <T>(from: string, decodedCall: DecodedCall<unknown>) =>\n getDryRunCall<T>(chain, from, decodedCall),\n\n isApiAvailable: (name: string, method: string) => isApiAvailable(chain, name, method),\n\n hasEvent: (pallet: string, event: string) => hasEvent(chain, pallet, event),\n\n hasConstant: (pallet: string, constant: string) => hasConstant(chain, pallet, constant),\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talismn/sapi",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
|
+
"description": "Scale API: build, decode, estimate and submit Polkadot SDK transactions over polkadot-api",
|
|
4
5
|
"author": "Talisman",
|
|
5
6
|
"homepage": "https://talisman.xyz",
|
|
6
7
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
"@polkadot-api/substrate-bindings": "0.20.3",
|
|
28
29
|
"@polkadot-api/tx-utils": "0.5.0",
|
|
29
30
|
"@polkadot-api/utils": "0.4.0",
|
|
30
|
-
"@talismn/scale": "2.0.
|
|
31
|
+
"@talismn/scale": "2.0.2",
|
|
31
32
|
"anylogger": "^1.0.11",
|
|
32
33
|
"scale-ts": "^1.6.1"
|
|
33
34
|
},
|
|
@@ -50,7 +51,7 @@
|
|
|
50
51
|
}
|
|
51
52
|
},
|
|
52
53
|
"scripts": {
|
|
53
|
-
"test": "vitest run",
|
|
54
|
+
"test": "vitest run --passWithNoTests",
|
|
54
55
|
"clean": "rm -rf dist .turbo node_modules",
|
|
55
56
|
"build": "tsdown -l error",
|
|
56
57
|
"typecheck": "tsc --noEmit"
|