@talismn/sapi 0.1.6 → 1.0.0
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/dist/index.js +21 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
package/dist/index.js
CHANGED
|
@@ -85,7 +85,7 @@ var import_anylogger = __toESM(require("anylogger"));
|
|
|
85
85
|
// package.json
|
|
86
86
|
var package_default = {
|
|
87
87
|
name: "@talismn/sapi",
|
|
88
|
-
version: "0.
|
|
88
|
+
version: "1.0.0",
|
|
89
89
|
author: "Talisman",
|
|
90
90
|
homepage: "https://talisman.xyz",
|
|
91
91
|
license: "GPL-3.0-or-later",
|
|
@@ -112,20 +112,20 @@ var package_default = {
|
|
|
112
112
|
typecheck: "tsc --noEmit"
|
|
113
113
|
},
|
|
114
114
|
dependencies: {
|
|
115
|
-
"@polkadot-api/merkleize-metadata": "1.
|
|
116
|
-
"@polkadot-api/metadata-builders": "0.
|
|
117
|
-
"@polkadot-api/substrate-bindings": "0.
|
|
118
|
-
"@polkadot-api/utils": "0.
|
|
119
|
-
"@polkadot/types": "16.
|
|
120
|
-
"@polkadot/types-codec": "16.
|
|
115
|
+
"@polkadot-api/merkleize-metadata": "1.2.3",
|
|
116
|
+
"@polkadot-api/metadata-builders": "0.14.3",
|
|
117
|
+
"@polkadot-api/substrate-bindings": "0.20.3",
|
|
118
|
+
"@polkadot-api/utils": "0.4.0",
|
|
119
|
+
"@polkadot/types": "16.5.6",
|
|
120
|
+
"@polkadot/types-codec": "16.5.6",
|
|
121
121
|
"@talismn/scale": "workspace:*",
|
|
122
122
|
anylogger: "^1.0.11",
|
|
123
|
-
"polkadot-api": "1.
|
|
123
|
+
"polkadot-api": "2.1.6",
|
|
124
124
|
"scale-ts": "^1.6.1"
|
|
125
125
|
},
|
|
126
126
|
devDependencies: {
|
|
127
127
|
"@talismn/tsconfig": "workspace:*",
|
|
128
|
-
typescript: "^
|
|
128
|
+
typescript: "^6.0.3"
|
|
129
129
|
},
|
|
130
130
|
types: "./dist/index.d.ts",
|
|
131
131
|
exports: {
|
|
@@ -211,7 +211,7 @@ var getDecodedCallFromPayload = (chain, payload) => {
|
|
|
211
211
|
|
|
212
212
|
// src/helpers/getDecodedCallFromExtrinsic.ts
|
|
213
213
|
var import_substrate_bindings = require("@polkadot-api/substrate-bindings");
|
|
214
|
-
var allBytesDec = (0, import_substrate_bindings.
|
|
214
|
+
var allBytesDec = (0, import_substrate_bindings.Bytes)(Infinity).dec;
|
|
215
215
|
var getDecodedCallFromExtrinsic = (chain, extrinsicHex) => {
|
|
216
216
|
try {
|
|
217
217
|
const { metadata, builder } = chain;
|
|
@@ -274,7 +274,7 @@ var getDecodedCallFromExtrinsic = (chain, extrinsicHex) => {
|
|
|
274
274
|
}),
|
|
275
275
|
(v) => ({
|
|
276
276
|
...v,
|
|
277
|
-
call: callDec(v.callData
|
|
277
|
+
call: callDec(v.callData)
|
|
278
278
|
})
|
|
279
279
|
);
|
|
280
280
|
const decoded = extrinsicDecoder(extrinsicHex);
|
|
@@ -438,9 +438,6 @@ var getDryRunCall = async (chain, from, decodedCall) => {
|
|
|
438
438
|
}
|
|
439
439
|
};
|
|
440
440
|
|
|
441
|
-
// src/helpers/getFeeEstimate.ts
|
|
442
|
-
var import_polkadot_api2 = require("polkadot-api");
|
|
443
|
-
|
|
444
441
|
// src/helpers/getExtrinsicDispatchInfo.ts
|
|
445
442
|
var import_utils3 = require("@polkadot-api/utils");
|
|
446
443
|
var getExtrinsicDispatchInfo = async (chain, signedExtrinsic) => {
|
|
@@ -461,7 +458,7 @@ var getExtrinsicDispatchInfo = async (chain, signedExtrinsic) => {
|
|
|
461
458
|
};
|
|
462
459
|
var stateCall = async (request, method, resultType, args, blockHash, isCacheable) => {
|
|
463
460
|
const registry = args[0].registry;
|
|
464
|
-
const bytes = registry.createType("Raw", (0, import_utils3.mergeUint8)(
|
|
461
|
+
const bytes = registry.createType("Raw", (0, import_utils3.mergeUint8)(args.map((arg) => arg.toU8a())));
|
|
465
462
|
const result = await request("state_call", [method, bytes.toHex(), blockHash], isCacheable);
|
|
466
463
|
return registry.createType(resultType, result);
|
|
467
464
|
};
|
|
@@ -493,13 +490,12 @@ var getFeeEstimate = async (chain, payload, chainInfo) => {
|
|
|
493
490
|
}
|
|
494
491
|
});
|
|
495
492
|
const bytes = extrinsic.toU8a(true);
|
|
496
|
-
const binary = import_polkadot_api2.Binary.fromBytes(bytes);
|
|
497
493
|
try {
|
|
498
494
|
const result = await getRuntimeCallResult(
|
|
499
495
|
chain,
|
|
500
496
|
"TransactionPaymentApi",
|
|
501
497
|
"query_info",
|
|
502
|
-
[
|
|
498
|
+
[bytes, bytes.length]
|
|
503
499
|
);
|
|
504
500
|
if (!result?.partial_fee && result.partial_fee !== 0n) {
|
|
505
501
|
throw new Error("partialFee is not found");
|
|
@@ -533,7 +529,7 @@ var getSapiConnector = ({
|
|
|
533
529
|
|
|
534
530
|
// src/helpers/getSignerPayloadJSON.ts
|
|
535
531
|
var import_utils5 = require("@polkadot-api/utils");
|
|
536
|
-
var
|
|
532
|
+
var import_polkadot_api2 = require("polkadot-api");
|
|
537
533
|
|
|
538
534
|
// src/helpers/getPayloadWithMetadataHash.ts
|
|
539
535
|
var import_merkleize_metadata = require("@polkadot-api/merkleize-metadata");
|
|
@@ -613,7 +609,7 @@ function trailingZeroes(n) {
|
|
|
613
609
|
var ERA_PERIOD = 64;
|
|
614
610
|
var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerConfig, chainInfo) => {
|
|
615
611
|
const { codec, location } = chain.builder.buildCall(palletName, methodName);
|
|
616
|
-
const method =
|
|
612
|
+
const method = (0, import_utils5.mergeUint8)([new Uint8Array(location), codec.enc(args)]);
|
|
617
613
|
let blockHash = await getSendRequestResult(
|
|
618
614
|
chain,
|
|
619
615
|
"chain_getFinalizedHead",
|
|
@@ -631,8 +627,10 @@ var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerCon
|
|
|
631
627
|
let blockNumber = blockNumberFinalized;
|
|
632
628
|
if (blockNumberCurrent - blockNumberFinalized > 32) {
|
|
633
629
|
blockNumber = blockNumberCurrent - 16;
|
|
634
|
-
const binBlockHash = await getStorageValue(chain, "System", "BlockHash", [
|
|
635
|
-
|
|
630
|
+
const binBlockHash = await getStorageValue(chain, "System", "BlockHash", [
|
|
631
|
+
blockNumber
|
|
632
|
+
]);
|
|
633
|
+
blockHash = binBlockHash;
|
|
636
634
|
}
|
|
637
635
|
const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD });
|
|
638
636
|
const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(
|
|
@@ -640,9 +638,9 @@ var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerCon
|
|
|
640
638
|
);
|
|
641
639
|
const basePayload = {
|
|
642
640
|
address: signerConfig.address,
|
|
643
|
-
genesisHash
|
|
641
|
+
genesisHash,
|
|
644
642
|
blockHash,
|
|
645
|
-
method:
|
|
643
|
+
method: import_polkadot_api2.Binary.toHex(method),
|
|
646
644
|
signedExtensions,
|
|
647
645
|
nonce: toPjsHex(nonce, 4),
|
|
648
646
|
specVersion: toPjsHex(chainInfo.specVersion, 4),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/fetchBestMetadata.ts","../src/sapi.ts","../src/log.ts","../package.json","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/getDryRunCall.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getTypeRegistry.ts","../src/helpers/getSapiConnector.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts"],"sourcesContent":["export * from \"./fetchBestMetadata\"\nexport * from \"./sapi\"\nexport * from \"./types\"\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 type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\"\nimport type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\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 { getTypeRegistry } from \"./helpers/getTypeRegistry\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\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, chainInfo),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n getTypeRegistry: (payload: SignerPayloadJSON) => getTypeRegistry(chain, payload),\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}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/sapi\",\n \"version\": \"0.1.6\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/sapi\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@polkadot-api/merkleize-metadata\": \"1.1.29\",\n \"@polkadot-api/metadata-builders\": \"0.13.9\",\n \"@polkadot-api/substrate-bindings\": \"0.17.0\",\n \"@polkadot-api/utils\": \"0.2.0\",\n \"@polkadot/types\": \"16.1.2\",\n \"@polkadot/types-codec\": \"16.1.2\",\n \"@talismn/scale\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"polkadot-api\": \"1.23.3\",\n \"scale-ts\": \"^1.6.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"typescript\": \"^5.6.3\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\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 \"@polkadot/types/types\"\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 Bin,\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 = Bin(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.asBytes()),\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 type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"polkadot-api\"\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 { 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 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 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 {\n IRuntimeVersionBase,\n SignatureOptions,\n SignerPayloadJSON,\n} from \"@polkadot/types/types\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getFeeEstimate = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n chainInfo: ChainInfo\n) => {\n // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n const registry = getTypeRegistry(chain, payload)\n const extrinsic = registry.createType(\"Extrinsic\", payload)\n\n extrinsic.signFake(payload.address, {\n appId: 0,\n nonce: payload.nonce,\n blockHash: payload.blockHash,\n genesisHash: payload.genesisHash,\n runtimeVersion: {\n specVersion: chainInfo.specVersion,\n transactionVersion: chainInfo.transactionVersion,\n // other fields aren't necessary for signing\n } as IRuntimeVersionBase,\n } as SignatureOptions)\n\n const bytes = extrinsic.toU8a(true)\n const binary = Binary.fromBytes(bytes)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [binary, 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, extrinsic)\n\n return BigInt(partialFee)\n}\n","import type { GenericExtrinsic } from \"@polkadot/types\"\nimport type { RuntimeDispatchInfo } from \"@polkadot/types/interfaces\"\nimport type { Codec } from \"@polkadot/types-codec/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport type { JsonRpcRequestSend } from \"../types\"\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// used for chains that dont have metadata v15 yet\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n signedExtrinsic: GenericExtrinsic\n): Promise<ExtrinsicDispatchInfo> => {\n if (!signedExtrinsic.isSigned)\n throw new Error(\"Extrinsic must be signed (or fakeSigned) in order to query fee\")\n\n const len = signedExtrinsic.registry.createType(\"u32\", signedExtrinsic.encodedLength)\n\n const dispatchInfo = (await stateCall(\n chain.connector.send,\n \"TransactionPaymentApi_query_info\",\n \"RuntimeDispatchInfo\",\n [signedExtrinsic, len],\n undefined,\n true\n )) as RuntimeDispatchInfo\n\n return {\n partialFee: dispatchInfo.partialFee.toString(),\n }\n}\n\nconst stateCall = async <K extends string = string>(\n request: JsonRpcRequestSend,\n method: string,\n resultType: K,\n args: Codec[],\n blockHash?: `0x${string}`,\n isCacheable?: boolean\n) => {\n // on a state call there are always arguments\n const registry = args[0].registry\n\n const bytes = registry.createType(\"Raw\", mergeUint8(...args.map((arg) => arg.toU8a())))\n\n const result = await request(\"state_call\", [method, bytes.toHex(), blockHash], isCacheable)\n\n return registry.createType(resultType, result)\n}\n","import { Metadata, TypeRegistry } from \"@polkadot/types\"\nimport type { RegistryTypes, SignerPayloadJSON } from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getTypeRegistry = (chain: Chain, payload: SignerPayloadJSON) => {\n log.debug(`[sapi] getTypeRegistry for payload (${chain.token.symbol})`)\n const registry = new TypeRegistry()\n\n if (chain.registryTypes) registry.register(chain.registryTypes as RegistryTypes)\n\n const meta = new Metadata(registry, chain.hexMetadata)\n registry.setMetadata(meta, payload.signedExtensions, chain.signedExtensions) // ~30ms\n\n return registry\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 { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\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\nconst ERA_PERIOD = 64 // validity period in blocks, used for mortal era\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 = Binary.fromBytes(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<Binary>(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<Binary>(chain, \"System\", \"BlockHash\", [blockNumber])\n blockHash = binBlockHash.asHex() as `0x${string}`\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: genesisHash.asHex() as `0x${string}`,\n blockHash,\n method: method.asHex(),\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 type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { toHex } from \"@polkadot-api/utils\"\n\nimport log from \"../log\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\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 // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n // const { extra, additionalSigned } = getSignedExtensionValues(payload, metadata)\n // const badExtPayload = mergeUint8([fromHex(payload.method), ...extra, ...additionalSigned])\n\n const registry = getTypeRegistry(chain, payload)\n const extPayload = registry.createType(\"ExtrinsicPayload\", payloadWithMetadataHash)\n const barePayload = extPayload.toU8a(true)\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 { 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, u16 } from \"@polkadot-api/substrate-bindings\"\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","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 \"@polkadot/types/types\"\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"],"mappings":"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","names":["import_scale","anylogger","import_utils","import_polkadot_api","import_utils","submit","import_utils","import_polkadot_api","import_utils","import_substrate_bindings","import_metadata_builders"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/fetchBestMetadata.ts","../src/sapi.ts","../src/log.ts","../package.json","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/getDryRunCall.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getTypeRegistry.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts"],"sourcesContent":["export * from \"./fetchBestMetadata\"\nexport * from \"./sapi\"\nexport * from \"./types\"\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 type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\"\nimport type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\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 { getTypeRegistry } from \"./helpers/getTypeRegistry\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\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, chainInfo),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n getTypeRegistry: (payload: SignerPayloadJSON) => getTypeRegistry(chain, payload),\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}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/sapi\",\n \"version\": \"1.0.0\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/sapi\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@polkadot-api/merkleize-metadata\": \"1.2.3\",\n \"@polkadot-api/metadata-builders\": \"0.14.3\",\n \"@polkadot-api/substrate-bindings\": \"0.20.3\",\n \"@polkadot-api/utils\": \"0.4.0\",\n \"@polkadot/types\": \"16.5.6\",\n \"@polkadot/types-codec\": \"16.5.6\",\n \"@talismn/scale\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"polkadot-api\": \"2.1.6\",\n \"scale-ts\": \"^1.6.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"typescript\": \"^6.0.3\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\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 \"@polkadot/types/types\"\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 type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"polkadot-api\"\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 { 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 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 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 { GenericExtrinsic } from \"@polkadot/types\"\nimport type { RuntimeDispatchInfo } from \"@polkadot/types/interfaces\"\nimport type { Codec } from \"@polkadot/types-codec/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport type { JsonRpcRequestSend } from \"../types\"\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// used for chains that dont have metadata v15 yet\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n signedExtrinsic: GenericExtrinsic\n): Promise<ExtrinsicDispatchInfo> => {\n if (!signedExtrinsic.isSigned)\n throw new Error(\"Extrinsic must be signed (or fakeSigned) in order to query fee\")\n\n const len = signedExtrinsic.registry.createType(\"u32\", signedExtrinsic.encodedLength)\n\n const dispatchInfo = (await stateCall(\n chain.connector.send,\n \"TransactionPaymentApi_query_info\",\n \"RuntimeDispatchInfo\",\n [signedExtrinsic, len],\n undefined,\n true\n )) as RuntimeDispatchInfo\n\n return {\n partialFee: dispatchInfo.partialFee.toString(),\n }\n}\n\nconst stateCall = async <K extends string = string>(\n request: JsonRpcRequestSend,\n method: string,\n resultType: K,\n args: Codec[],\n blockHash?: `0x${string}`,\n isCacheable?: boolean\n) => {\n // on a state call there are always arguments\n const registry = args[0].registry\n\n const bytes = registry.createType(\"Raw\", mergeUint8(args.map((arg) => arg.toU8a())))\n\n const result = await request(\"state_call\", [method, bytes.toHex(), blockHash], isCacheable)\n\n return registry.createType(resultType, result)\n}\n","import { Metadata, TypeRegistry } from \"@polkadot/types\"\nimport type { RegistryTypes, SignerPayloadJSON } from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getTypeRegistry = (chain: Chain, payload: SignerPayloadJSON) => {\n log.debug(`[sapi] getTypeRegistry for payload (${chain.token.symbol})`)\n const registry = new TypeRegistry()\n\n if (chain.registryTypes) registry.register(chain.registryTypes as RegistryTypes)\n\n const meta = new Metadata(registry, chain.hexMetadata)\n registry.setMetadata(meta, payload.signedExtensions, chain.signedExtensions) // ~30ms\n\n return registry\n}\n","import type {\n IRuntimeVersionBase,\n SignatureOptions,\n SignerPayloadJSON,\n} from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getFeeEstimate = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n chainInfo: ChainInfo\n) => {\n // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n const registry = getTypeRegistry(chain, payload)\n const extrinsic = registry.createType(\"Extrinsic\", payload)\n\n extrinsic.signFake(payload.address, {\n appId: 0,\n nonce: payload.nonce,\n blockHash: payload.blockHash,\n genesisHash: payload.genesisHash,\n runtimeVersion: {\n specVersion: chainInfo.specVersion,\n transactionVersion: chainInfo.transactionVersion,\n // other fields aren't necessary for signing\n } as IRuntimeVersionBase,\n } as SignatureOptions)\n\n const bytes = extrinsic.toU8a(true)\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, extrinsic)\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 { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\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\nconst ERA_PERIOD = 64 // validity period in blocks, used for mortal era\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 type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { toHex } from \"@polkadot-api/utils\"\n\nimport log from \"../log\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\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 // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n // const { extra, additionalSigned } = getSignedExtensionValues(payload, metadata)\n // const badExtPayload = mergeUint8([fromHex(payload.method), ...extra, ...additionalSigned])\n\n const registry = getTypeRegistry(chain, payload)\n const extPayload = registry.createType(\"ExtrinsicPayload\", payloadWithMetadataHash)\n const barePayload = extPayload.toU8a(true)\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 { 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, u16 } from \"@polkadot-api/substrate-bindings\"\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","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 \"@polkadot/types/types\"\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"],"mappings":"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","names":["import_scale","anylogger","import_utils","import_utils","submit","import_utils","import_polkadot_api","import_utils","import_substrate_bindings","import_metadata_builders"]}
|
package/dist/index.mjs
CHANGED
|
@@ -47,7 +47,7 @@ import anylogger from "anylogger";
|
|
|
47
47
|
// package.json
|
|
48
48
|
var package_default = {
|
|
49
49
|
name: "@talismn/sapi",
|
|
50
|
-
version: "0.
|
|
50
|
+
version: "1.0.0",
|
|
51
51
|
author: "Talisman",
|
|
52
52
|
homepage: "https://talisman.xyz",
|
|
53
53
|
license: "GPL-3.0-or-later",
|
|
@@ -74,20 +74,20 @@ var package_default = {
|
|
|
74
74
|
typecheck: "tsc --noEmit"
|
|
75
75
|
},
|
|
76
76
|
dependencies: {
|
|
77
|
-
"@polkadot-api/merkleize-metadata": "1.
|
|
78
|
-
"@polkadot-api/metadata-builders": "0.
|
|
79
|
-
"@polkadot-api/substrate-bindings": "0.
|
|
80
|
-
"@polkadot-api/utils": "0.
|
|
81
|
-
"@polkadot/types": "16.
|
|
82
|
-
"@polkadot/types-codec": "16.
|
|
77
|
+
"@polkadot-api/merkleize-metadata": "1.2.3",
|
|
78
|
+
"@polkadot-api/metadata-builders": "0.14.3",
|
|
79
|
+
"@polkadot-api/substrate-bindings": "0.20.3",
|
|
80
|
+
"@polkadot-api/utils": "0.4.0",
|
|
81
|
+
"@polkadot/types": "16.5.6",
|
|
82
|
+
"@polkadot/types-codec": "16.5.6",
|
|
83
83
|
"@talismn/scale": "workspace:*",
|
|
84
84
|
anylogger: "^1.0.11",
|
|
85
|
-
"polkadot-api": "1.
|
|
85
|
+
"polkadot-api": "2.1.6",
|
|
86
86
|
"scale-ts": "^1.6.1"
|
|
87
87
|
},
|
|
88
88
|
devDependencies: {
|
|
89
89
|
"@talismn/tsconfig": "workspace:*",
|
|
90
|
-
typescript: "^
|
|
90
|
+
typescript: "^6.0.3"
|
|
91
91
|
},
|
|
92
92
|
types: "./dist/index.d.ts",
|
|
93
93
|
exports: {
|
|
@@ -173,7 +173,7 @@ var getDecodedCallFromPayload = (chain, payload) => {
|
|
|
173
173
|
|
|
174
174
|
// src/helpers/getDecodedCallFromExtrinsic.ts
|
|
175
175
|
import {
|
|
176
|
-
|
|
176
|
+
Bytes,
|
|
177
177
|
compactNumber,
|
|
178
178
|
createDecoder,
|
|
179
179
|
enhanceDecoder,
|
|
@@ -181,7 +181,7 @@ import {
|
|
|
181
181
|
Struct,
|
|
182
182
|
u8
|
|
183
183
|
} from "@polkadot-api/substrate-bindings";
|
|
184
|
-
var allBytesDec =
|
|
184
|
+
var allBytesDec = Bytes(Infinity).dec;
|
|
185
185
|
var getDecodedCallFromExtrinsic = (chain, extrinsicHex) => {
|
|
186
186
|
try {
|
|
187
187
|
const { metadata, builder } = chain;
|
|
@@ -244,7 +244,7 @@ var getDecodedCallFromExtrinsic = (chain, extrinsicHex) => {
|
|
|
244
244
|
}),
|
|
245
245
|
(v) => ({
|
|
246
246
|
...v,
|
|
247
|
-
call: callDec(v.callData
|
|
247
|
+
call: callDec(v.callData)
|
|
248
248
|
})
|
|
249
249
|
);
|
|
250
250
|
const decoded = extrinsicDecoder(extrinsicHex);
|
|
@@ -408,9 +408,6 @@ var getDryRunCall = async (chain, from, decodedCall) => {
|
|
|
408
408
|
}
|
|
409
409
|
};
|
|
410
410
|
|
|
411
|
-
// src/helpers/getFeeEstimate.ts
|
|
412
|
-
import { Binary } from "polkadot-api";
|
|
413
|
-
|
|
414
411
|
// src/helpers/getExtrinsicDispatchInfo.ts
|
|
415
412
|
import { mergeUint8 } from "@polkadot-api/utils";
|
|
416
413
|
var getExtrinsicDispatchInfo = async (chain, signedExtrinsic) => {
|
|
@@ -431,7 +428,7 @@ var getExtrinsicDispatchInfo = async (chain, signedExtrinsic) => {
|
|
|
431
428
|
};
|
|
432
429
|
var stateCall = async (request, method, resultType, args, blockHash, isCacheable) => {
|
|
433
430
|
const registry = args[0].registry;
|
|
434
|
-
const bytes = registry.createType("Raw", mergeUint8(
|
|
431
|
+
const bytes = registry.createType("Raw", mergeUint8(args.map((arg) => arg.toU8a())));
|
|
435
432
|
const result = await request("state_call", [method, bytes.toHex(), blockHash], isCacheable);
|
|
436
433
|
return registry.createType(resultType, result);
|
|
437
434
|
};
|
|
@@ -463,13 +460,12 @@ var getFeeEstimate = async (chain, payload, chainInfo) => {
|
|
|
463
460
|
}
|
|
464
461
|
});
|
|
465
462
|
const bytes = extrinsic.toU8a(true);
|
|
466
|
-
const binary = Binary.fromBytes(bytes);
|
|
467
463
|
try {
|
|
468
464
|
const result = await getRuntimeCallResult(
|
|
469
465
|
chain,
|
|
470
466
|
"TransactionPaymentApi",
|
|
471
467
|
"query_info",
|
|
472
|
-
[
|
|
468
|
+
[bytes, bytes.length]
|
|
473
469
|
);
|
|
474
470
|
if (!result?.partial_fee && result.partial_fee !== 0n) {
|
|
475
471
|
throw new Error("partialFee is not found");
|
|
@@ -503,7 +499,7 @@ var getSapiConnector = ({
|
|
|
503
499
|
|
|
504
500
|
// src/helpers/getSignerPayloadJSON.ts
|
|
505
501
|
import { mergeUint8 as mergeUint82, toHex as toHex4 } from "@polkadot-api/utils";
|
|
506
|
-
import { Binary
|
|
502
|
+
import { Binary } from "polkadot-api";
|
|
507
503
|
|
|
508
504
|
// src/helpers/getPayloadWithMetadataHash.ts
|
|
509
505
|
import { merkleizeMetadata } from "@polkadot-api/merkleize-metadata";
|
|
@@ -557,14 +553,14 @@ var getStorageValue = async (chain, pallet, entry, keys, at) => {
|
|
|
557
553
|
};
|
|
558
554
|
|
|
559
555
|
// src/helpers/papi.ts
|
|
560
|
-
import { Bytes, enhanceEncoder, u16 } from "@polkadot-api/substrate-bindings";
|
|
556
|
+
import { Bytes as Bytes2, enhanceEncoder, u16 } from "@polkadot-api/substrate-bindings";
|
|
561
557
|
var toPjsHex = (value, minByteLen) => {
|
|
562
558
|
let inner = value.toString(16);
|
|
563
559
|
inner = (inner.length % 2 ? "0" : "") + inner;
|
|
564
560
|
const nPaddedBytes = Math.max(0, (minByteLen || 0) - inner.length / 2);
|
|
565
561
|
return `0x${"00".repeat(nPaddedBytes)}${inner}`;
|
|
566
562
|
};
|
|
567
|
-
var mortal = enhanceEncoder(
|
|
563
|
+
var mortal = enhanceEncoder(Bytes2(2).enc, (value) => {
|
|
568
564
|
const factor = Math.max(value.period >> 12, 1);
|
|
569
565
|
const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15);
|
|
570
566
|
const right = value.phase / factor << 4;
|
|
@@ -583,7 +579,7 @@ function trailingZeroes(n) {
|
|
|
583
579
|
var ERA_PERIOD = 64;
|
|
584
580
|
var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerConfig, chainInfo) => {
|
|
585
581
|
const { codec, location } = chain.builder.buildCall(palletName, methodName);
|
|
586
|
-
const method =
|
|
582
|
+
const method = mergeUint82([new Uint8Array(location), codec.enc(args)]);
|
|
587
583
|
let blockHash = await getSendRequestResult(
|
|
588
584
|
chain,
|
|
589
585
|
"chain_getFinalizedHead",
|
|
@@ -601,8 +597,10 @@ var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerCon
|
|
|
601
597
|
let blockNumber = blockNumberFinalized;
|
|
602
598
|
if (blockNumberCurrent - blockNumberFinalized > 32) {
|
|
603
599
|
blockNumber = blockNumberCurrent - 16;
|
|
604
|
-
const binBlockHash = await getStorageValue(chain, "System", "BlockHash", [
|
|
605
|
-
|
|
600
|
+
const binBlockHash = await getStorageValue(chain, "System", "BlockHash", [
|
|
601
|
+
blockNumber
|
|
602
|
+
]);
|
|
603
|
+
blockHash = binBlockHash;
|
|
606
604
|
}
|
|
607
605
|
const era = mortal({ period: ERA_PERIOD, phase: blockNumber % ERA_PERIOD });
|
|
608
606
|
const signedExtensions = (chain.metadata.extrinsic.signedExtensions[0] ?? []).map(
|
|
@@ -610,9 +608,9 @@ var getSignerPayloadJSON = async (chain, palletName, methodName, args, signerCon
|
|
|
610
608
|
);
|
|
611
609
|
const basePayload = {
|
|
612
610
|
address: signerConfig.address,
|
|
613
|
-
genesisHash
|
|
611
|
+
genesisHash,
|
|
614
612
|
blockHash,
|
|
615
|
-
method:
|
|
613
|
+
method: Binary.toHex(method),
|
|
616
614
|
signedExtensions,
|
|
617
615
|
nonce: toPjsHex(nonce, 4),
|
|
618
616
|
specVersion: toPjsHex(chainInfo.specVersion, 4),
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fetchBestMetadata.ts","../src/sapi.ts","../src/log.ts","../package.json","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/getDryRunCall.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getTypeRegistry.ts","../src/helpers/getSapiConnector.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts"],"sourcesContent":["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 type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\"\nimport type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\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 { getTypeRegistry } from \"./helpers/getTypeRegistry\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\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, chainInfo),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n getTypeRegistry: (payload: SignerPayloadJSON) => getTypeRegistry(chain, payload),\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}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/sapi\",\n \"version\": \"0.1.6\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/sapi\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@polkadot-api/merkleize-metadata\": \"1.1.29\",\n \"@polkadot-api/metadata-builders\": \"0.13.9\",\n \"@polkadot-api/substrate-bindings\": \"0.17.0\",\n \"@polkadot-api/utils\": \"0.2.0\",\n \"@polkadot/types\": \"16.1.2\",\n \"@polkadot/types-codec\": \"16.1.2\",\n \"@talismn/scale\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"polkadot-api\": \"1.23.3\",\n \"scale-ts\": \"^1.6.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"typescript\": \"^5.6.3\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\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 \"@polkadot/types/types\"\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 Bin,\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 = Bin(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.asBytes()),\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 type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"polkadot-api\"\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 { 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 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 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 {\n IRuntimeVersionBase,\n SignatureOptions,\n SignerPayloadJSON,\n} from \"@polkadot/types/types\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getFeeEstimate = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n chainInfo: ChainInfo\n) => {\n // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n const registry = getTypeRegistry(chain, payload)\n const extrinsic = registry.createType(\"Extrinsic\", payload)\n\n extrinsic.signFake(payload.address, {\n appId: 0,\n nonce: payload.nonce,\n blockHash: payload.blockHash,\n genesisHash: payload.genesisHash,\n runtimeVersion: {\n specVersion: chainInfo.specVersion,\n transactionVersion: chainInfo.transactionVersion,\n // other fields aren't necessary for signing\n } as IRuntimeVersionBase,\n } as SignatureOptions)\n\n const bytes = extrinsic.toU8a(true)\n const binary = Binary.fromBytes(bytes)\n\n try {\n const result = await getRuntimeCallResult<{ partial_fee: bigint }>(\n chain,\n \"TransactionPaymentApi\",\n \"query_info\",\n [binary, 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, extrinsic)\n\n return BigInt(partialFee)\n}\n","import type { GenericExtrinsic } from \"@polkadot/types\"\nimport type { RuntimeDispatchInfo } from \"@polkadot/types/interfaces\"\nimport type { Codec } from \"@polkadot/types-codec/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport type { JsonRpcRequestSend } from \"../types\"\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// used for chains that dont have metadata v15 yet\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n signedExtrinsic: GenericExtrinsic\n): Promise<ExtrinsicDispatchInfo> => {\n if (!signedExtrinsic.isSigned)\n throw new Error(\"Extrinsic must be signed (or fakeSigned) in order to query fee\")\n\n const len = signedExtrinsic.registry.createType(\"u32\", signedExtrinsic.encodedLength)\n\n const dispatchInfo = (await stateCall(\n chain.connector.send,\n \"TransactionPaymentApi_query_info\",\n \"RuntimeDispatchInfo\",\n [signedExtrinsic, len],\n undefined,\n true\n )) as RuntimeDispatchInfo\n\n return {\n partialFee: dispatchInfo.partialFee.toString(),\n }\n}\n\nconst stateCall = async <K extends string = string>(\n request: JsonRpcRequestSend,\n method: string,\n resultType: K,\n args: Codec[],\n blockHash?: `0x${string}`,\n isCacheable?: boolean\n) => {\n // on a state call there are always arguments\n const registry = args[0].registry\n\n const bytes = registry.createType(\"Raw\", mergeUint8(...args.map((arg) => arg.toU8a())))\n\n const result = await request(\"state_call\", [method, bytes.toHex(), blockHash], isCacheable)\n\n return registry.createType(resultType, result)\n}\n","import { Metadata, TypeRegistry } from \"@polkadot/types\"\nimport type { RegistryTypes, SignerPayloadJSON } from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getTypeRegistry = (chain: Chain, payload: SignerPayloadJSON) => {\n log.debug(`[sapi] getTypeRegistry for payload (${chain.token.symbol})`)\n const registry = new TypeRegistry()\n\n if (chain.registryTypes) registry.register(chain.registryTypes as RegistryTypes)\n\n const meta = new Metadata(registry, chain.hexMetadata)\n registry.setMetadata(meta, payload.signedExtensions, chain.signedExtensions) // ~30ms\n\n return registry\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 { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\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\nconst ERA_PERIOD = 64 // validity period in blocks, used for mortal era\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 = Binary.fromBytes(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<Binary>(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<Binary>(chain, \"System\", \"BlockHash\", [blockNumber])\n blockHash = binBlockHash.asHex() as `0x${string}`\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: genesisHash.asHex() as `0x${string}`,\n blockHash,\n method: method.asHex(),\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 type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { toHex } from \"@polkadot-api/utils\"\n\nimport log from \"../log\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\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 // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n // const { extra, additionalSigned } = getSignedExtensionValues(payload, metadata)\n // const badExtPayload = mergeUint8([fromHex(payload.method), ...extra, ...additionalSigned])\n\n const registry = getTypeRegistry(chain, payload)\n const extPayload = registry.createType(\"ExtrinsicPayload\", payloadWithMetadataHash)\n const barePayload = extPayload.toU8a(true)\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 { 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, u16 } from \"@polkadot-api/substrate-bindings\"\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","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 \"@polkadot/types/types\"\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"],"mappings":"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","names":["toHex","toHex","submit","mergeUint8","toHex","Binary","toHex","toHex","Binary","mergeUint8","toHex","getLookupFn","getLookupFn"]}
|
|
1
|
+
{"version":3,"sources":["../src/fetchBestMetadata.ts","../src/sapi.ts","../src/log.ts","../package.json","../src/helpers/getCallDocs.ts","../src/helpers/getConstantValue.ts","../src/helpers/getChainInfo.ts","../src/helpers/getDecodedCall.ts","../src/helpers/getDecodedCallFromExtrinsic.ts","../src/helpers/getDryRunCall.ts","../src/helpers/errors.ts","../src/helpers/getRuntimeCallResult.ts","../src/helpers/getSendRequestResult.ts","../src/helpers/isApiAvailable.ts","../src/helpers/getExtrinsicDispatchInfo.ts","../src/helpers/getTypeRegistry.ts","../src/helpers/getFeeEstimate.ts","../src/helpers/getSapiConnector.ts","../src/helpers/getSignerPayloadJSON.ts","../src/helpers/getPayloadWithMetadataHash.ts","../src/helpers/getStorageValue.ts","../src/helpers/papi.ts","../src/helpers/hasEvent.ts","../src/helpers/submit.ts"],"sourcesContent":["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 type { ExtDef } from \"@polkadot/types/extrinsic/signedExtensions/types\"\nimport type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\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 { getTypeRegistry } from \"./helpers/getTypeRegistry\"\nimport { hasEvent } from \"./helpers/hasEvent\"\nimport { isApiAvailable } from \"./helpers/isApiAvailable\"\nimport { submit } from \"./helpers/submit\"\nimport type { Chain } from \"./helpers/types\"\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, chainInfo),\n\n getRuntimeCallValue: <T>(apiName: string, method: string, args: unknown[]) =>\n getRuntimeCallResult<T>(chain, apiName, method, args),\n\n getTypeRegistry: (payload: SignerPayloadJSON) => getTypeRegistry(chain, payload),\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}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/sapi\",\n \"version\": \"1.0.0\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/sapi\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@polkadot-api/merkleize-metadata\": \"1.2.3\",\n \"@polkadot-api/metadata-builders\": \"0.14.3\",\n \"@polkadot-api/substrate-bindings\": \"0.20.3\",\n \"@polkadot-api/utils\": \"0.4.0\",\n \"@polkadot/types\": \"16.5.6\",\n \"@polkadot/types-codec\": \"16.5.6\",\n \"@talismn/scale\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"polkadot-api\": \"2.1.6\",\n \"scale-ts\": \"^1.6.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"typescript\": \"^6.0.3\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\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 \"@polkadot/types/types\"\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 type { polkadot, polkadotAssetHub } from \"@polkadot-api/descriptors\"\nimport { Enum } from \"polkadot-api\"\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 { 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 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 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 { GenericExtrinsic } from \"@polkadot/types\"\nimport type { RuntimeDispatchInfo } from \"@polkadot/types/interfaces\"\nimport type { Codec } from \"@polkadot/types-codec/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport type { JsonRpcRequestSend } from \"../types\"\nimport type { Chain } from \"./types\"\n\ntype ExtrinsicDispatchInfo = {\n partialFee: string\n}\n\n// used for chains that dont have metadata v15 yet\nexport const getExtrinsicDispatchInfo = async (\n chain: Chain,\n signedExtrinsic: GenericExtrinsic\n): Promise<ExtrinsicDispatchInfo> => {\n if (!signedExtrinsic.isSigned)\n throw new Error(\"Extrinsic must be signed (or fakeSigned) in order to query fee\")\n\n const len = signedExtrinsic.registry.createType(\"u32\", signedExtrinsic.encodedLength)\n\n const dispatchInfo = (await stateCall(\n chain.connector.send,\n \"TransactionPaymentApi_query_info\",\n \"RuntimeDispatchInfo\",\n [signedExtrinsic, len],\n undefined,\n true\n )) as RuntimeDispatchInfo\n\n return {\n partialFee: dispatchInfo.partialFee.toString(),\n }\n}\n\nconst stateCall = async <K extends string = string>(\n request: JsonRpcRequestSend,\n method: string,\n resultType: K,\n args: Codec[],\n blockHash?: `0x${string}`,\n isCacheable?: boolean\n) => {\n // on a state call there are always arguments\n const registry = args[0].registry\n\n const bytes = registry.createType(\"Raw\", mergeUint8(args.map((arg) => arg.toU8a())))\n\n const result = await request(\"state_call\", [method, bytes.toHex(), blockHash], isCacheable)\n\n return registry.createType(resultType, result)\n}\n","import { Metadata, TypeRegistry } from \"@polkadot/types\"\nimport type { RegistryTypes, SignerPayloadJSON } from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport type { Chain } from \"./types\"\n\nexport const getTypeRegistry = (chain: Chain, payload: SignerPayloadJSON) => {\n log.debug(`[sapi] getTypeRegistry for payload (${chain.token.symbol})`)\n const registry = new TypeRegistry()\n\n if (chain.registryTypes) registry.register(chain.registryTypes as RegistryTypes)\n\n const meta = new Metadata(registry, chain.hexMetadata)\n registry.setMetadata(meta, payload.signedExtensions, chain.signedExtensions) // ~30ms\n\n return registry\n}\n","import type {\n IRuntimeVersionBase,\n SignatureOptions,\n SignerPayloadJSON,\n} from \"@polkadot/types/types\"\n\nimport log from \"../log\"\nimport { getExtrinsicDispatchInfo } from \"./getExtrinsicDispatchInfo\"\nimport { getRuntimeCallResult } from \"./getRuntimeCallResult\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\nimport type { Chain, ChainInfo } from \"./types\"\n\nexport const getFeeEstimate = async (\n chain: Chain,\n payload: SignerPayloadJSON,\n chainInfo: ChainInfo\n) => {\n // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n const registry = getTypeRegistry(chain, payload)\n const extrinsic = registry.createType(\"Extrinsic\", payload)\n\n extrinsic.signFake(payload.address, {\n appId: 0,\n nonce: payload.nonce,\n blockHash: payload.blockHash,\n genesisHash: payload.genesisHash,\n runtimeVersion: {\n specVersion: chainInfo.specVersion,\n transactionVersion: chainInfo.transactionVersion,\n // other fields aren't necessary for signing\n } as IRuntimeVersionBase,\n } as SignatureOptions)\n\n const bytes = extrinsic.toU8a(true)\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, extrinsic)\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 { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { Binary } from \"polkadot-api\"\n\nimport log from \"../log\"\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\nconst ERA_PERIOD = 64 // validity period in blocks, used for mortal era\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 type { SignerPayloadJSON } from \"@polkadot/types/types\"\nimport { merkleizeMetadata } from \"@polkadot-api/merkleize-metadata\"\nimport { toHex } from \"@polkadot-api/utils\"\n\nimport log from \"../log\"\nimport { getTypeRegistry } from \"./getTypeRegistry\"\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 // TODO do this without PJS / registry => waiting for @polkadot-api/tx-utils\n // const { extra, additionalSigned } = getSignedExtensionValues(payload, metadata)\n // const badExtPayload = mergeUint8([fromHex(payload.method), ...extra, ...additionalSigned])\n\n const registry = getTypeRegistry(chain, payload)\n const extPayload = registry.createType(\"ExtrinsicPayload\", payloadWithMetadataHash)\n const barePayload = extPayload.toU8a(true)\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 { 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, u16 } from \"@polkadot-api/substrate-bindings\"\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","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 \"@polkadot/types/types\"\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"],"mappings":"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","names":["toHex","toHex","submit","mergeUint8","toHex","toHex","toHex","Bytes","mergeUint8","toHex","getLookupFn","getLookupFn"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talismn/sapi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"author": "Talisman",
|
|
5
5
|
"homepage": "https://talisman.xyz",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -21,19 +21,19 @@
|
|
|
21
21
|
"node": ">=20"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@polkadot-api/merkleize-metadata": "1.
|
|
25
|
-
"@polkadot-api/metadata-builders": "0.
|
|
26
|
-
"@polkadot-api/substrate-bindings": "0.
|
|
27
|
-
"@polkadot-api/utils": "0.
|
|
28
|
-
"@polkadot/types": "16.
|
|
29
|
-
"@polkadot/types-codec": "16.
|
|
24
|
+
"@polkadot-api/merkleize-metadata": "1.2.3",
|
|
25
|
+
"@polkadot-api/metadata-builders": "0.14.3",
|
|
26
|
+
"@polkadot-api/substrate-bindings": "0.20.3",
|
|
27
|
+
"@polkadot-api/utils": "0.4.0",
|
|
28
|
+
"@polkadot/types": "16.5.6",
|
|
29
|
+
"@polkadot/types-codec": "16.5.6",
|
|
30
30
|
"anylogger": "^1.0.11",
|
|
31
|
-
"polkadot-api": "1.
|
|
31
|
+
"polkadot-api": "2.1.6",
|
|
32
32
|
"scale-ts": "^1.6.1",
|
|
33
|
-
"@talismn/scale": "0.
|
|
33
|
+
"@talismn/scale": "1.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"typescript": "^
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
37
|
"@talismn/tsconfig": "0.0.4"
|
|
38
38
|
},
|
|
39
39
|
"types": "./dist/index.d.ts",
|