@palliora.org/chainsdk 0.5.0 → 0.5.1

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/account/account.ts","../src/account/types.ts","../src/chain/spec.ts","../src/crypto/core.ts","../src/crypto/cipher.ts","../src/utils/assert.ts","../src/config.ts","../src/utils/helper.ts","../src/utils/token.ts","../src/chain/singleton.ts","../src/chain/utils.ts","../src/guardian/active.ts","../src/guardian/group.ts","../src/guardian/join.ts","../src/chain/onchainfs.ts","../src/chain/blocks.ts","../src/token/balance.ts","../src/account/info.ts","../src/compute/agreement.ts","../src/compute/data.ts","../src/compute/fees.ts","../src/compute/encryptedInference.ts","../src/crypto/random.ts","../src/compute/inference.ts","../src/compute/participants.ts","../src/compute/simple.ts","../src/compute/stored.ts","../src/costEstimation/client.ts","../src/costEstimation/estimate.ts","../src/costEstimation/auction.ts","../src/costEstimation/webhook.ts","../src/costEstimation/health.ts","../src/da/register.ts","../src/da/runAgent.ts","../src/da/submit.ts","../src/da/upload.ts","../src/stake/add.ts","../src/stake/idle.ts","../src/stake/new.ts","../src/stake/payout.ts","../src/stake/reduce.ts","../src/stake/remove.ts","../src/stake/withdraw.ts","../src/storage/s3.ts","../src/storage/router.ts","../src/token/fund.ts","../src/token/transfer.ts","../src/validator/join.ts","../src/identity.ts","../src/indexer/client.ts","../src/indexer/artefacts.ts","../src/indexer/contracts.ts","../src/indexer/blobs.ts","../src/indexer/flow.ts","../src/indexer/blocks.ts","../src/indexer/calls.ts","../src/indexer/transfers.ts","../src/indexer/extrinsics.ts","../src/indexer/addresses.ts","../src/indexer/guardians.ts","../src/indexer/access.ts","../src/rotateKeys.ts","../src/index.ts","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/bundle.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/keyring.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/index.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/decode.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/defaults.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/encode.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/toJson.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/defaults.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pairs.js"],"sourcesContent":["import { waitReady } from \"@polkadot/wasm-crypto\";\nimport { AccountSourceType, CryptoType } from \"./types\";\nimport { Keyring } from \"@polkadot/api\";\nimport { hexToU8a } from \"@polkadot/util\";\nimport { ed25519PairFromSecret, secp256k1PairFromSeed } from \"@polkadot/util-crypto\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { keccak256 } from \"viem\";\nimport { poseidon1, poseidon2 } from \"poseidon-lite\";\n\n/**\n * Creates a Substrate account from a private key, seed, or mnemonic.\n * @param input - The input string (private key hex, seed hex, or mnemonic phrase).\n * @param type - The type of input: 'privateKey', 'seed', or 'mnemonic'.\n * @param cryptoType - The crypto type: 'sr25519' | 'ed25519' | 'ecdsa' (default: 'sr25519').\n * @returns The keypair object.\n */\nexport async function createAccount(\n input: string,\n type: AccountSourceType,\n name: string = \"default\",\n cryptoType: CryptoType = CryptoType.SR25519,\n signedMsg: string = \"sign\",\n): Promise<KeyringPair> {\n await waitReady();\n const keyring = new Keyring({ type: cryptoType });\n\n switch (type) {\n case AccountSourceType.PRIVATE_KEY: {\n const pair = pairFromPrivateKeyHex(input, cryptoType);\n return keyring.addFromPair(pair, { name }, cryptoType);\n }\n case AccountSourceType.SEED: {\n const seed = hexToU8a(input);\n\n if (seed.length !== 32) {\n throw new Error(\n `Invalid ${cryptoType} seed length. Expected 32 bytes, got ${seed.length}`\n );\n }\n\n return keyring.addFromSeed(seed, { name }, cryptoType);\n }\n case AccountSourceType.MNEMONIC:\n // format: <mnemonic or mini-secret>[//hard-derivation][/soft-derivation][///password]\n // refer docs: https://polkadot.js.org/docs/keyring/start/suri/\n return keyring.createFromUri(input, { name }, cryptoType);\n case AccountSourceType.ADDRESS:\n const account = keyring.addFromAddress(\n input,\n { name },\n null,\n cryptoType\n );\n return account;\n case AccountSourceType.DERIVED:\n if (!input.startsWith(\"0x\")) {\n throw new Error(\"Invalid signature format for derived account. Expected hex string starting with 0x.\");\n }\n const signKeyBytes = sigToSeed(signedMsg, input as `0x${string}`);\n return createAccount(signKeyBytes, AccountSourceType.SEED, name, cryptoType);\n default:\n throw new Error(\"Invalid input type\");\n }\n}\n\n/**\n * Derives a Substrate account from a Magic Link (or other Ethereum-compatible)\n * signature over the fixed message `createAccount` expects for signature-derived\n * accounts, wiring passwordless/email-based onboarding into the existing\n * `AccountSourceType.DERIVED` flow.\n *\n * @param signature - Hex-encoded signature (0x-prefixed) produced by the Magic Link signer.\n */\nexport async function createAccountFromMagicLink(\n signature: string,\n name: string = \"default\",\n cryptoType: CryptoType = CryptoType.SR25519,\n): Promise<KeyringPair> {\n return createAccount(signature, AccountSourceType.DERIVED, name, cryptoType);\n}\n\nexport function pairFromPrivateKeyHex(privateKeyHex: string, cryptoType: CryptoType) {\n const privateKey = hexToU8a(privateKeyHex);\n\n switch (cryptoType) {\n case CryptoType.ED25519:\n if (privateKey.length !== 64) {\n throw new Error(\n `Invalid ed25519 private key length. Expected 64 bytes, got ${privateKey.length}`\n );\n }\n return ed25519PairFromSecret(privateKey);\n case CryptoType.ECDSA:\n if (privateKey.length !== 32) {\n throw new Error(\n `Invalid ecdsa private key length. Expected 32 bytes, got ${privateKey.length}`\n );\n }\n return secp256k1PairFromSeed(privateKey);\n case CryptoType.SR25519:\n if (privateKey.length !== 96) {\n throw new Error(\n `Invalid sr25519 private key length. Expected 96 bytes (secret+public), got ${privateKey.length}`\n );\n }\n return {\n secretKey: privateKey.slice(0, 64),\n publicKey: privateKey.slice(64, 96),\n };\n default:\n throw new Error(`Unsupported crypto type: ${cryptoType}`);\n }\n}\n\nfunction sigToSeed(msg: string, sign: `0x${string}`) {\n const seed = BigInt(keccak256(sign));\n const encoder = new TextEncoder();\n\n const signBytes = encoder.encode(msg);\n const signHex = Array.from(signBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const SALT_SIGN = poseidon1([BigInt(`0x${signHex}`)]);\n\n // Convert to 32 bytes (64 hex characters)\n const signKeyBytes = poseidon2([seed.toString(), SALT_SIGN])\n .toString(16)\n .slice(0, 64); // Ensure exactly 64 hex characters (32 bytes)\n\n return signKeyBytes;\n}\n","enum CryptoType {\n SR25519 = \"sr25519\",\n ED25519 = \"ed25519\",\n ECDSA = \"ecdsa\",\n}\n\nenum AccountSourceType {\n PRIVATE_KEY = \"privateKey\",\n SEED = \"seed\",\n MNEMONIC = \"mnemonic\",\n DERIVED = \"derived\",\n ADDRESS = \"address\",\n}\n\nexport { CryptoType, AccountSourceType };\n","\nexport const API_RPC = {\n\tkate: {\n\t\tqueryRows: {\n\t\t\tdescription: \"\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"rows\",\n\t\t\t\t\ttype: \"Vec<u32>\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"Vec<GRow>\",\n\t\t},\n\t\tqueryProof: {\n\t\t\tdescription: \"Generate the kate proof for the given `cells`\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"cells\",\n\t\t\t\t\ttype: \"Vec<Cell>\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"Vec<GDataProof>\",\n\t\t},\n\t\tblockLength: {\n\t\t\tdescription: \"Get Block Length\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"BlockLength\",\n\t\t},\n\t\tqueryDataProof: {\n\t\t\tdescription: \"Generate the data proof for the given `transaction_index`\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"transaction_index\",\n\t\t\t\t\ttype: \"u32\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"ProofResponse\",\n\t\t},\n\t},\n\tguardian: {\n\t\truntimeInfo: {\n\t\t\tdescription: \"Fetch guardian runtime info\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: 'at',\n\t\t\t\t\ttype: 'Hash',\n\t\t\t\t\tisOptional: true\n\t\t\t\t}\n\t\t\t],\n\t\t\ttype: 'GuardianInfo'\n\t\t},\n\t\tguardianList: {\n\t\t\tdescription: \"Fetch guardian list\",\n\t\t\tparams: [],\n\t\t\ttype: 'Vec<String>'\n\t\t},\n\t\tguardianNwParams: {\n\t\t\tdescription: \"Fetch guardian network parameters\",\n\t\t\tparams: [],\n\t\t\ttype: 'GuardianNwParams'\n\t\t}\n\t},\n};\n\nexport const API_TYPES = {\n\tGuardianInfo: {\n\t\tactive: 'u32',\n\t\tmaximum: 'u32'\n\t},\n\tCurrencyId: {\n\t\t_enum: {\n\t\t\tNative: 'Null',\n\t\t\tUSDC: 'Null',\n\t\t\tForeignAsset: 'u32',\n\t\t},\n\t},\n\tGuardianNwParams: {\n\t\tkzg: 'Vec<u8>',\n\t\taggKey: 'Vec<u8>'\n\t},\n\tAppId: \"Compact<u32>\",\n\tDataLookupItem: {\n\t\tappId: \"AppId\",\n\t\tstart: \"Compact<u32>\",\n\t},\n\tCompactDataLookup: {\n\t\tsize: \"Compact<u32>\",\n\t\tindex: \"Vec<DataLookupItem>\",\n\t},\n\tKateCommitment: {\n\t\trows: \"Compact<u16>\",\n\t\tcols: \"Compact<u16>\",\n\t\tcommitment: \"Vec<u8>\",\n\t\tdataRoot: \"H256\",\n\t},\n\tV3HeaderExtension: {\n\t\tappLookup: \"CompactDataLookup\",\n\t\tcommitment: \"KateCommitment\",\n\t},\n\tHeaderExtension: {\n\t\t_enum: {\n\t\t\tV1: null,\n\t\t\tV2: null,\n\t\t\tV3: \"V3HeaderExtension\",\n\t\t},\n\t},\n\tDaHeader: {\n\t\tparentHash: \"Hash\",\n\t\tnumber: \"Compact<BlockNumber>\",\n\t\tstateRoot: \"Hash\",\n\t\textrinsicsRoot: \"Hash\",\n\t\tdigest: \"Digest\",\n\t\textension: \"HeaderExtension\",\n\t},\n\tHeader: \"DaHeader\",\n\tCheckAppIdExtra: {\n\t\tappId: \"AppId\",\n\t},\n\tCheckAppIdTypes: {},\n\tCheckAppId: {\n\t\textra: \"CheckAppIdExtra\",\n\t\ttypes: \"CheckAppIdTypes\",\n\t},\n\tFeePayload: {\n\t\tcompute: \"u128\",\n\t\tguardian: \"u128\",\n\t\tverifier: \"u128\",\n\t},\n\tSilentThresholdParams: {\n\t\ttdParams: 'Vec<u8>',\n\t\tpkBytes: 'Vec<u8>',\n\t\ttauParams: 'Vec<u8>'\n\t},\n\tThresholdParams: {\n\t\t_enum: {\n\t\tSilentThreshold: 'SilentThresholdParams'\n\t\t}\n\t},\n\tChaCha20Poly1305Params: {\n\t\tnonce: '[u8; 12]'\n\t},\n\tAes256GcmParams: {\n\t\tnonce: '[u8; 12]'\n\t},\n\tSymmetricParams: {\n\t\t_enum: {\n\t\tChaCha20Poly1305: 'ChaCha20Poly1305Params',\n\t\tAes256Gcm: 'Aes256GcmParams'\n\t\t}\n\t},\n\tKdfParams: {\n\t\t_enum: {\n\t\tHkdfSha256: 'Null',\n\t\tHkdfSha512: 'Null'\n\t\t}\n\t},\n\tSecp256k1Params: {\n\t\trecipientPublicKey: 'Vec<u8>',\n\t\tephemeralPublicKey: 'Option<Vec<u8>>',\n\t\tcompressed: 'bool',\n\t\tkdf: 'KdfParams',\n\t\tsalt: 'Option<Vec<u8>>',\n\t\tinfo: 'Option<Vec<u8>>'\n\t},\n\tEd25519Params: {\n\t\trecipientPublicKey: 'Vec<u8>',\n\t\tephemeralPublicKey: 'Option<Vec<u8>>',\n\t\tkdf: 'KdfParams',\n\t\tsalt: 'Option<Vec<u8>>',\n\t\tinfo: 'Option<Vec<u8>>'\n\t},\n\tAsymmetricParams: {\n\t\t_enum: {\n\t\tSecp256k1: 'Secp256k1Params',\n\t\tEd25519: 'Ed25519Params'\n\t\t}\n\t},\n\tThresholdHybridParams: {\n\t\tthresholdParams: 'ThresholdParams',\n\t\tsymmetricParams: 'SymmetricParams'\n\t},\n\tAsymmetricHybridParams: {\n\t\tasymmetricParams: 'AsymmetricParams',\n\t\tsymmetricParams: 'SymmetricParams'\n\t},\n\tCipherSuite: {\n\t\t_enum: {\n\t\tPlaintext: 'Null',\n\t\tThresholdHybrid: 'ThresholdHybridParams',\n\t\tAsymmetricHybrid: 'AsymmetricHybridParams'\n\t\t}\n\t},\n\tConfidentialityLevel: {\n\t\t_enum: {\n\t\tTrusted: 'u32',\n\t\tTEE: 'Null',\n\t\tFHE: 'Null',\n\t\tSMPC: 'Null'\n\t\t}\n\t},\n\tNativeExecuteDA: {\n\t\t_enum: ['Inference', 'ContractAccess']\n\t},\n\tNativeDataDA: {\n\t\t_enum: ['DaFalse', 'DaTrue']\n\t},\n\tDAInputInline: {\n\t\tdata: 'Vec<u8>'\n\t},\n\tDAInputChainTransaction: {\n\t\tblockNumber: 'u64',\n\t\textrinsicIndex: 'u32'\n\t},\n\tDAInputContractId: {\n\t\tid: '[u8; 32]'\n\t},\n\tDAInputIpfs: {\n\t\tcid: 'Vec<u8>',\n\t\tsize: 'u64'\n\t},\n\tDAInputUrl: {\n\t\turl: 'Vec<u8>',\n\t\tsize: 'u64',\n\t\thash: 'Option<Vec<u8>>'\n\t},\n\tDAInput: {\n\t\t_enum: {\n\t\tNull: 'Null',\n\t\tInline: 'DAInputInline',\n\t\tChainTransaction: 'DAInputChainTransaction',\n\t\tContractId: 'DAInputContractId',\n\t\tIpfs: 'DAInputIpfs',\n\t\tUrl: 'DAInputUrl',\n\t\tNativeExecute: 'NativeExecuteDA',\n\t\tNativeData: 'NativeDataDA'\n\t\t}\n\t},\n\tContractType: {\n\t\t_enum: {\n\t\tDormant: 'Null',\n\t\tActive: 'Null',\n\t\tSubscription: 'Null',\n\t\t}\n\t},\n\tStoreType: {\n\t\t_enum: {\n\t\tDataset: 'Null', // 0\n\t\tModel: 'Null', // 1\n\t\tAgent: 'Null', // 2\n\t\tExecutable: 'Null', // 3\n\t\tOther: 'Null', // 4\n\t\t}\n\t},\n\tComputeMetadata: {\n\t\tname: 'Vec<u8>',\n\t\tdescription: 'Vec<u8>',\n\t\tstoreType: 'StoreType',\n\t\tgroupId: 'H256',\n\t},\n\tComputeInfo: {\n\t\tcipher: 'CipherSuite',\n\t\tcomputerIndices: 'Vec<u32>',\n\t\tfees: 'u128',\n\t\tcomputeRate: 'u128',\n\t\tdeadline: 'u64',\n\t\tconfidentiality: 'ConfidentialityLevel',\n\t\tfeeFunction: 'Option<u8>',\n\t\tprogramEnv: 'Option<Vec<u8>>',\n\t\tinput: 'DAInput',\n\t\tprogram: 'DAInput',\n\t\tmetadata: 'Option<ComputeMetadata>',\n\t},\n\tContract: {\n\t\tcontractType: 'ContractType',\n\t\tguardians: 'Vec<AccountId>',\n\t\tpreCheck: 'Option<ComputeInfo>',\n\t\tcompute: 'ComputeInfo',\n\t\tpostCheck: 'Option<ComputeInfo>',\n\t\tresultCipher: 'CipherSuite',\n\t\tcurrencyId: 'CurrencyId'\n\t},\n\tAgreementInfo: {\n\t\tstatus: 'AgreementStatus',\n\t\tcreator: 'AccountId',\n\t\tindex: 'u32'\n\t},\n ComputePayload: {\n\t\tdaType: \"u8\",\n\t\tagreement: \"Option<BoundedVec<[u8; 32], 10>>\",\n\t\tverification: \"u8\",\n\t\tcompute: \"u8\",\n },\n\tComputePrefs: {\n\t\ttrusted: \"bool\",\n\t\ttee: \"bool\",\n\t\tmpc: \"bool\",\n\t\tfhe: \"bool\",\n\t\tzkp: \"bool\",\n\t},\n\tComputeType: {\n\t\t_enum: [\"Trusted\", \"Tee\", \"Mpc\", \"Fhe\", \"Zkp\"],\n\t},\n\tGuardianPrefs: {\n\t\tpubKey: \"[u8; 32]\",\n\t\tguardian: \"bool\",\n\t\tverifier: \"bool\",\n\t\tcompute: \"bool\",\n\t\tcomputePrefs: \"Option<ComputePrefs>\",\n\t\tfeeThresholds: \"Vec<(ComputeType, u128)>\",\n\t},\n\tBlockLengthColumns: \"Compact<u32>\",\n\tBlockLengthRows: \"Compact<u32>\",\n\tBlockLength: {\n\t\tmax: \"PerDispatchClass\",\n\t\tcols: \"BlockLengthColumns\",\n\t\trows: \"BlockLengthRows\",\n\t\tchunkSize: \"Compact<u32>\",\n\t},\n\tPerDispatchClass: {\n\t\tnormal: \"u32\",\n\t\toperational: \"u32\",\n\t\tmandatory: \"u32\",\n\t},\n\tTxDataRoots: {\n\t\tdataRoot: \"H256\",\n\t\tblobRoot: \"H256\",\n\t\tbridgeRoot: \"H256\",\n\t},\n\tDataProof: {\n\t\troots: \"TxDataRoots\",\n\t\tproof: \"Vec<H256>\",\n\t\tnumberOfLeaves: \"Compact<u32>\",\n\t\tleafIndex: \"Compact<u32>\",\n\t\tleaf: \"H256\",\n\t},\n\tProofResponse: {\n\t\tdataProof: \"DataProof\",\n\t\tmessage: \"Option<AddressedMessage>\",\n\t},\n\tAddressedMessage: {\n\t\tmessage: \"Message\",\n\t\tfrom: \"H256\",\n\t\tto: \"H256\",\n\t\toriginDomain: \"u32\",\n\t\tdestinationDomain: \"u32\",\n\t\tid: \"u64\",\n\t},\n\tMessage: {\n\t\t_enum: {\n\t\t\tArbitraryMessage: \"ArbitraryMessage\",\n\t\t\tFungibleToken: \"FungibleToken\",\n\t\t},\n\t},\n\tFungibleToken: {\n\t\tassetId: \"H256\",\n\t\tamount: \"u128\",\n\t},\n\tBoundedData: \"Vec<u8>\",\n\tArbitraryMessage: \"BoundedData\",\n\tCell: {\n\t\trow: \"u32\",\n\t\tcol: \"u32\",\n\t},\n\tGRawScalar: \"U256\",\n\tGProof: \"[u8; 48]\",\n\tGRow: \"Vec<GRawScalar>\",\n\tGDataProof: \"(GRawScalar, GProof)\",\n\tAgreementStatus: {\n\t\t_enum: ['NotFound', 'Pending', 'Accepted', 'Rejected', 'Settled']\n\t},\n\tAcceptedSubStatus: {\n\t\t_enum: ['Running', 'AwaitingTopUp', 'TopUpReceived', 'RejectedInsufficientBudget', 'RejectedRateMismatch']\n\t},\n\tRejectedSubStatus: {\n\t\t_enum: ['InsufficientBudget', 'RateMismatch']\n\t},\n\tSettlementReason: {\n\t\t_enum: ['ResultReceived', 'DeadlineReached', 'BudgetExhausted']\n\t},\n\tExecutionOutcome: {\n\t\t_enum: ['FullSettlement', 'PartialSettlement', 'Success', 'Failed', 'Terminated', 'TopUpTimeout']\n\t},\n\tContractInfo: {\n\t\tstatus: 'AgreementStatus',\n\t\towner: 'AccountId',\n\t\toriginBlock: 'u32',\n\t\tinvocationBlock: 'u32',\n\t\tindex: 'u32',\n\t\tusagePrice: 'u128',\n\t\tcontractType: 'ContractType',\n\t},\n\tSettlementInfo: {\n\t\tcomputeRate: 'u128',\n\t\tinputContractId: 'Option<[u8; 32]>',\n\t\tguardians: 'Vec<AccountId>',\n\t},\n\tAppKeyInfo: {\n\t\towner: 'AccountId',\n\t\tid: 'AppId',\n\t},\n\tDataType: {\n\t\t_enum: ['Dataset', 'Model', 'Agent']\n\t},\n};\n\nexport const DEFAULT_COMPUTE_PAYLOAD = { compute: { daType: 0, verification: 0, compute: 0 } };\nexport const DEFAULT_EMPTY_PAYLOAD = { compute: { daType: 0, verification: 0, compute: 0, agreement: [] } };\n\nexport const API_EXTENSIONS = {\n\tCheckAppId: {\n\t\textrinsic: {\n\t\t\tappId: \"AppId\",\n\t\t},\n\t\tpayload: {},\n\t},\n\tCheckCompute: {\n\t\textrinsic: {\n\t\t\t\tcompute: \"ComputePayload\",\n\t\t},\n\t\tpayload: {},\n\t},\n\t// Replaces pallet_transaction_payment::ChargeTransactionPayment. Since this\n\t// identifier isn't one @polkadot/api knows natively, this definition entirely\n\t// replaces (not merges with) the built-in one, so `tip` must be re-declared\n\t// here alongside the new `currencyId` field or it silently drops from the\n\t// encoded extra bytes, shifting every extrinsic out of alignment.\n\tChargeCurrencyTransactionPayment: {\n\t\textrinsic: {\n\t\t\ttip: \"Compact<Balance>\",\n\t\t\tcurrencyId: \"Option<CurrencyId>\",\n\t\t},\n\t\tpayload: {},\n\t},\n};\n","// import { CurveType } from '@noble/curves/abstract/bls';\nimport { bls12_381 as bls } from \"@noble/curves/bls12-381\";\nimport type { ProjPointType } from \"@noble/curves/abstract/weierstrass\";\nimport type { Fp, Fp12, Fp2 } from \"@noble/curves/abstract/tower\";\n\n/**\n * Summary of porting the Silent Threshold encryption scheme from Rust to JavaScript.\n *\n * The Silent Threshold encryption scheme is a threshold encryption scheme that uses BLS12-381 as the underlying elliptic curve.\n * The scheme is based on the BLS signature scheme and uses the BLS pairing to encrypt and decrypt data.\n *\n * The types ported from the original Rust implementation are:\n * - E::ScalarField -> BigInt\n * - QuadExtField -> Fp2\n * - CubicExtField -> Fp6\n * - E::G1 -> ProjPointType<Fp>\n * - E::G2 -> ProjPointType<Fp2>\n * - PairingOutput -> ProjPointType<Fp12>\n */\n\n/**\n * @typedef {Object} PublicKey\n * @property {number} id - The identifier for the public key.\n * @property {ProjPointType<Fp>} bls_pk - The BLS public key.\n * @property {ProjPointType<Fp>} sk_li - The secret key component li.\n * @property {ProjPointType<Fp>} sk_li_minus0 - The secret key component li minus 0.\n * @property {ProjPointType<Fp>} sk_li_x - The secret key component li x.\n * @property {Array<ProjPointType<Fp>>} sk_li_lj_z - The secret key components li lj z.\n */\ntype PublicKey = {\n\tid: number;\n\tbls_pk: ProjPointType<Fp>;\n\tsk_li: ProjPointType<Fp>; //hint\n\tsk_li_minus0: ProjPointType<Fp>; //hint\n\tsk_li_lj_z: Array<ProjPointType<Fp>>; //hint\n\tsk_li_x: ProjPointType<Fp>; //hint\n};\n\n/**\n * @typedef {Object} LagrangePowers\n * @property {Array<CurveType>} li - The Lagrange coefficients li.\n * @property {Array<ProjPointType<Fp>>} li_minus0 - The Lagrange coefficients li minus 0.\n * @property {Array<ProjPointType<Fp>>} li_x - The Lagrange coefficients li x.\n * @property {Array<Array<ProjPointType<Fp>>>} li_lj_z - The Lagrange coefficients li lj z.\n */\ntype LagrangePowers = {\n\t// li: Array<CurveType>,\n\tli_minus0: Array<ProjPointType<Fp>>;\n\tli_x: Array<ProjPointType<Fp>>;\n\tli_lj_z: Array<Array<ProjPointType<Fp>>>;\n};\n\n/**\n * @typedef {ProjPointType<Fp12>} PairingOutput - The output of the pairing operation.\n */\ntype PairingOutput = ProjPointType<Fp12>;\n\n/**\n * @typedef {Object} AggregateKey\n * @property {Array<PublicKey>} pk - The array of public keys.\n * @property {Array<ProjPointType<Fp>>} agg_sk_li_lj_z - The aggregated secret key components li lj z.\n * @property {ProjPointType<Fp>} ask - The aggregated secret key.\n * @property {ProjPointType<Fp2>} z_g2 - The z_g2 component.\n * @property {ProjPointType<Fp2>} h_minus1 - The h_minus1 component.\n * @property {PairingOutput} e_gh - The preprocessed pairing output.\n */\ntype AggregateKey = {\n\tpk: Array<PublicKey>;\n\tagg_sk_li_lj_z: Array<ProjPointType<Fp>>;\n\task: ProjPointType<Fp>;\n\tz_g2: ProjPointType<Fp2>;\n\n\t//preprocessed values\n\th_minus1: ProjPointType<Fp2>;\n\te_gh: Fp12;\n};\n\n/**\n * @typedef {Object} Ciphertext\n * @property {ProjPointType<Fp2>} gamma_g2 - The gamma_g2 component.\n * @property {Array<ProjPointType<Fp>>} sa1 - The sa1 components (2 elements).\n * @property {Array<ProjPointType<Fp2>>} sa2 - The sa2 components (6 elements).\n * @property {PairingOutput} enc_key - The encryption key.\n * @property {number} t - The threshold value.\n */\ntype Ciphertext = {\n\tgamma_g2: ProjPointType<Fp2>;\n\tsa1: ProjPointType<Fp>[];\n\tsa2: ProjPointType<Fp2>[];\n\tenc_key: Fp12; // key to be used for encapsulation\n\tt: number; // threshold\n};\n\n/**\n * @typedef {Object} PowersOfTau\n * @property {ArrayLike<ProjPointType<Fp>>} powers_of_g - The powers of g.\n * @property {ArrayLike<ProjPointType<Fp2>>} powers_of_h - The powers of h.\n */\ntype PowersOfTau = {\n\tpowers_of_g: ArrayLike<ProjPointType<Fp>>;\n\tpowers_of_h: ArrayLike<ProjPointType<Fp2>>;\n};\n\n/**\n * Encrypts data using the provided parameters and aggregate public key.\n *\n * @param params - The PowersOfTau parameters containing powers of g and h.\n * @param apk - The AggregateKey containing the aggregated public key and preprocessed values.\n * @param t - The threshold value for encryption.\n * @returns A Ciphertext object containing the encrypted data.\n */\nconst encrypt = (params: PowersOfTau, apk: AggregateKey, t: number) => {\n\t// Initialize an ArrayBuffer (tau) from a fixed string\n\tconst gamma = bls.fields.Fr.create(\n\t\tBigInt(\n\t\t\t\"0x\" +\n\t\t\treverseEndianess(\n\t\t\t\t\"8660d3c2a2ab458dd6da04d3e7cb5cf6edb702dfa2fa0c952cd6f3bcdc0fdb1a\",\n\t\t\t),\n\t\t),\n\t);\n\t// console.log(gamma.toString(16));\n\t// const gamma = bls.G1.normPrivateKeyToScalar(bls.utils.randomPrivateKey());\n\tconst gamma_g2 = params.powers_of_h[0].multiply(gamma);\n\t// console.log(gamma_g2.toHex(true));\n\n\tlet g = params.powers_of_g[0];\n\tlet h = params.powers_of_h[0];\n\n\tlet sa1 = [bls.G1.ProjectivePoint.BASE, bls.G1.ProjectivePoint.BASE];\n\tlet sa2: ProjPointType<Fp2>[] = Array(6).fill(bls.G2.ProjectivePoint.BASE);\n\t// sa1.forEach((value, index) => {\n\t// console.log(`sa1[${index}]: ${value.toHex(true)}`);\n\t// });\n\t// sa2.forEach((value, index) => {\n\t// console.log(`sa2[${index}]: ${value.toHex(true)}`);\n\t// });\n\n\tconst hexValues = [\n\t\treverseEndianess(\n\t\t\t\"08ca6f2a35f8f6f9cad58e9d764d450af154c246fc04266151e2a5493ff02943\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"8696a66087578b92e1b4b11c6b4c06d4694a9bed1f9468f0115e7f2648eb021d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"91e201cc83dc03cc47d63cfb8a9016e73ffd1a78fffd14e4dfcdf2cbb9a7245d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"a90598c6e0f25c3a104fc94632b1d58cf21bca3bbd7e41da07feb9c14e0fa60d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"d3f5a9fc8abfef02fb6095c08ba4f3445b36f0fb963579bc5112d34a02044567\",\n\t\t),\n\t];\n\n\t// let s = hexValues.map((hex) => bls.G1.normPrivateKeyToScalar(hex));\n\t// s.forEach((value, index) => {\n\t// console.log(`s[${index}]: ${value.toString(16)}`);\n\t// });\n\tconst s = Array.from({ length: 5 }, () => bls.G1.normPrivateKeyToScalar(bls.utils.randomPrivateKey()));\n\n\t// sa1[0] = s0*ask + s3*g^{tau^t} + s4*g\n\tsa1[0] = apk.ask\n\t\t.multiply(s[0])\n\t\t.add(params.powers_of_g[t].multiply(s[3]))\n\t\t.add(params.powers_of_g[0].multiply(s[4]));\n\n\t// sa1[1] = s2*g\n\tsa1[1] = g.multiply(s[2]);\n\n\t// sa2[0] = s0*h + s2*gamma_g2\n\tsa2[0] = h.multiply(s[0]).add(gamma_g2.multiply(s[2]));\n\n\t// sa2[1] = s0*z_g2\n\tsa2[1] = apk.z_g2.multiply(s[0]);\n\n\t// sa2[2] = s0*h^tau + s1*h^tau\n\tsa2[2] = params.powers_of_h[1]\n\t\t.multiply(s[0])\n\t\t.add(params.powers_of_h[1].multiply(s[1]));\n\n\t// sa2[3] = s1*h\n\tsa2[3] = h.multiply(s[1]);\n\n\t// sa2[4] = s3*h\n\tsa2[4] = h.multiply(s[3]);\n\n\t// sa2[5] = s4*h^{tau - omega^0}\n\tsa2[5] = params.powers_of_h[1].add(apk.h_minus1).multiply(s[4]);\n\n\t// enc_key = s4*e_gh\n\tconst enc_key = bls.fields.Fp12.pow(apk.e_gh, s[4]);\n\t// const enc_key = apk.e_gh.multiply(s[4]);\n\n\treturn { gamma_g2, sa1, sa2, enc_key, t };\n};\n\n/**\n * Decodes a hex string into a PowersOfTau object.\n *\n * @param input - The hex string to decode.\n * @returns A PowersOfTau object containing the decoded data.\n */\nconst decodePowersOfTau = (input: string): PowersOfTau => {\n\ttry {\n\t\t// Ensure input is properly formatted\n\t\tif (!input || input.length % 2 !== 0) {\n\t\t\tthrow new Error('Invalid input hex string');\n\t\t}\n\n\t\t// Convert hex string to Uint8Array\n\t\tconst hexArray = input.match(/.{1,2}/g) || [];\n\t\tconst buffer = new Uint8Array(hexArray.map(byte => parseInt(byte, 16)));\n\n\t\t// Create ArrayBuffer with the correct size\n\t\tconst arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n\t\tconst view = new DataView(arrayBuffer);\n\n\t\tconst powers_of_g: Array<ProjPointType<Fp>> = [];\n\t\tconst powers_of_h: Array<ProjPointType<Fp2>> = [];\n\n\t\tconst G1_POINT_SIZE = 48; // 96/2 bytes for G1 points\n\t\tconst G2_POINT_SIZE = 96; // 192/2 bytes for G2 points\n\n\t\tlet offset = 0;\n\n\t\t// Read count safely\n\t\tif (offset + 8 > buffer.length) {\n\t\t\tthrow new Error('Buffer too small to read count');\n\t\t}\n\t\tconst count = view.getBigUint64(offset, true);\n\t\toffset += 8;\n\n\t\t// Read powers_of_g\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tif (offset + G1_POINT_SIZE > buffer.length) {\n\t\t\t\tthrow new Error('Buffer too small to read G1 point');\n\t\t\t}\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + G1_POINT_SIZE);\n\t\t\tconst point = bls.G1.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpowers_of_g.push(point);\n\t\t\toffset += G1_POINT_SIZE;\n\t\t}\n\n\t\t// Skip the second count\n\t\tif (offset + 8 > buffer.length) {\n\t\t\tthrow new Error('Buffer too small to read second count');\n\t\t}\n\t\toffset += 8;\n\n\t\t// Read powers_of_h\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tif (offset + G2_POINT_SIZE > buffer.length) {\n\t\t\t\tthrow new Error('Buffer too small to read G2 point');\n\t\t\t}\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + G2_POINT_SIZE);\n\t\t\tconst point = bls.G2.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpowers_of_h.push(point);\n\t\t\toffset += G2_POINT_SIZE;\n\t\t}\n\n\t\treturn { powers_of_g, powers_of_h };\n\t} catch (error) {\n\t\tconsole.error('Error in decodePowersOfTau:', error);\n\t\tconsole.log('Input length:', input.length);\n\t\tconsole.log('Input preview:', input.slice(0, 100));\n\t\tthrow error;\n\t}\n};\n\n// Helper function to check if a hex string is valid\nconst isValidHex = (hex: string): boolean => {\n\treturn /^[0-9A-Fa-f]*$/.test(hex) && hex.length % 2 === 0;\n};\n\n// Helper function to safely create a DataView from a hex string\nconst createDataViewFromHex = (hex: string): { view: DataView, buffer: Uint8Array } => {\n\tif (!isValidHex(hex)) {\n\t\tthrow new Error('Invalid hex string');\n\t}\n\tconst buffer = new Uint8Array(hex.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)));\n\tconst arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n\treturn {\n\t\tview: new DataView(arrayBuffer),\n\t\tbuffer\n\t};\n};\n\n/**\n * Decodes a hex string into an AggregateKey object.\n *\n * @param input - The hex string to decode.\n * @returns An AggregateKey object containing the decoded data.\n */\nconst decodeAggregateKey = (input: string): AggregateKey => {\n\tconst buffer = new Uint8Array(input.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\tlet offset = 0;\n\n\tconst view = new DataView(buffer.buffer);\n\tconst readBigUInt64LE = () => {\n\t\tconst value = view.getBigUint64(offset, true);\n\t\toffset += 8;\n\t\treturn value;\n\t};\n\n\tconst readProjPointTypeFp = (count: bigint) => {\n\t\tconst points: Array<ProjPointType<Fp>> = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 48);\n\t\t\tconst point = bls.G1.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpoints.push(point);\n\t\t\toffset += 48;\n\t\t}\n\t\treturn points;\n\t};\n\n\tconst readProjPointTypeFp2 = (count: bigint) => {\n\t\tconst points: Array<ProjPointType<Fp2>> = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 96);\n\t\t\tconst point = bls.G2.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpoints.push(point);\n\t\t\toffset += 96;\n\t\t}\n\t\treturn points;\n\t};\n\n\tconst readProjPointTypeFp12 = () => {\n\t\tconst points: Array<Fp> = [];\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 48);\n\t\t\t// Convert to hex and reverse for endianness\n\t\t\tconst hexValue = Array.from(pointBuffer)\n\t\t\t\t.reverse()\n\t\t\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t\t\t.join('');\n\t\t\tconst point = BigInt(\"0x\" + hexValue);\n\t\t\tpoints.push(point);\n\t\t\toffset += 48;\n\t\t}\n\t\tif (points.length !== 12) {\n\t\t\tthrow new Error(\"Invalid number of points for Fp12\");\n\t\t}\n\t\treturn bls.fields.Fp12.create({\n\t\t\tc0: bls.fields.Fp6.create({\n\t\t\t\tc0: bls.fields.Fp2.create({ c0: points[0], c1: points[1] }),\n\t\t\t\tc1: bls.fields.Fp2.create({ c0: points[2], c1: points[3] }),\n\t\t\t\tc2: bls.fields.Fp2.create({ c0: points[4], c1: points[5] }),\n\t\t\t}),\n\t\t\tc1: bls.fields.Fp6.create({\n\t\t\t\tc0: bls.fields.Fp2.create({ c0: points[6], c1: points[7] }),\n\t\t\t\tc1: bls.fields.Fp2.create({ c0: points[8], c1: points[9] }),\n\t\t\t\tc2: bls.fields.Fp2.create({ c0: points[10], c1: points[11] }),\n\t\t\t}),\n\t\t});\n\t};\n\n\tconst pkCount = readBigUInt64LE();\n\tconst pk: Array<PublicKey> = [];\n\tfor (let i = 0; i < pkCount; i++) {\n\t\tconst id = Number(readBigUInt64LE());\n\t\tconst bls_pk = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li_minus0 = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li_lj_z = readProjPointTypeFp(readBigUInt64LE());\n\t\tconst sk_li_x = readProjPointTypeFp(BigInt(1))[0];\n\t\tpk.push({ id, bls_pk, sk_li, sk_li_minus0, sk_li_x, sk_li_lj_z });\n\t}\n\n\tconst agg_sk_li_lj_z = readProjPointTypeFp(readBigUInt64LE());\n\tconst ask = readProjPointTypeFp(BigInt(1))[0];\n\tconst z_g2 = readProjPointTypeFp2(BigInt(1))[0];\n\tconst h_minus1 = readProjPointTypeFp2(BigInt(1))[0];\n\tconst e_gh = readProjPointTypeFp12();\n\n\treturn { pk, agg_sk_li_lj_z, ask, z_g2, h_minus1, e_gh };\n};\n\n/**\n * Encode a Ciphertext object into a hex string.\n *\n * @param input - The Ciphertext object to encode.\n * @returns A hex string containing the encoded data.\n */\nconst encodeCiphertext = (input: Ciphertext): string => {\n\tconst writeProjPointTypeFp = (point: ProjPointType<Fp>) => {\n\t\tconst hex = point.toHex(true);\n\t\treturn new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\t};\n\n\tconst writeProjPointTypeFp2 = (point: ProjPointType<Fp2>) => {\n\t\tconst hex = point.toHex(true);\n\t\treturn new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\t};\n\n\tconst gamma_g2Buffer = writeProjPointTypeFp2(input.gamma_g2);\n\tconst sa1Buffer = new Uint8Array(input.sa1.flatMap(p => Array.from(writeProjPointTypeFp(p))));\n\tconst sa2Buffer = new Uint8Array(input.sa2.flatMap(p => Array.from(writeProjPointTypeFp2(p))));\n\tconst enc_keyBuffer = new Uint8Array(fp12ToHex(input.enc_key).match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\n\tconst tBuffer = new Uint8Array(8);\n\tnew DataView(tBuffer.buffer).setBigUint64(0, BigInt(input.t), true);\n\n\tconst totalLength = gamma_g2Buffer.length + sa1Buffer.length + sa2Buffer.length + enc_keyBuffer.length + tBuffer.length;\n\tconst resultBuffer = new Uint8Array(totalLength);\n\n\tlet offset = 0;\n\tresultBuffer.set(gamma_g2Buffer, offset);\n\toffset += gamma_g2Buffer.length;\n\tresultBuffer.set(sa1Buffer, offset);\n\toffset += sa1Buffer.length;\n\tresultBuffer.set(sa2Buffer, offset);\n\toffset += sa2Buffer.length;\n\tresultBuffer.set(enc_keyBuffer, offset);\n\toffset += enc_keyBuffer.length;\n\tresultBuffer.set(tBuffer, offset);\n\n\treturn Array.from(resultBuffer)\n\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n};\n\nfunction demoFieldOperations() {\n\t// Create base points in G1 and G2\n\tconst g1Base = bls.G1.ProjectivePoint.BASE;\n\tconst g2Base = bls.G2.ProjectivePoint.BASE;\n\tconsole.log(\"G1 generator: \", g1Base.toHex(true));\n\tconsole.log(\"G2 generator: \", g2Base.toHex(true));\n\n\tconst scalar = bls.fields.Fr.create(\n\t\tBigInt(\n\t\t\t\"0x1d8a77a2bc0faf4c4c904eed119108ed9b375265f7d06cec6862a2a97c3adb27\",\n\t\t),\n\t);\n\tconsole.log(\"Scalar: \", scalar.toString(16));\n\n\tconst e_ghH = bls.pairing(g1Base, g2Base);\n\tconsole.log(fp12ToHex(e_ghH));\n\t// return\n\n\t// Perform G1 addition\n\tconst g1Sum = g1Base.add(g1Base);\n\tconsole.log(\"G1 generator doubled: \", g1Sum.toHex(true));\n\n\t// Perform G2 addition\n\tconst g2Sum = g2Base.add(g2Base);\n\tconsole.log(\"G2 generator doubled: \", g2Sum.toHex(true));\n\n\t// Create an Fp element and do multiplication\n\tconst fp_a = bls.fields.Fp.create(\n\t\tBigInt(\n\t\t\t\"0xa191b705ef18a6e4e5bd4cc56de0b8f94b1f3c908f3e3fcbd4d1dc12eb85059be7e7d801edc1856c8cfbe6d63a681c1f\",\n\t\t),\n\t);\n\tconst fp_b = bls.fields.Fp.create(\n\t\tBigInt(\n\t\t\t\"0x8e07730c0dceb35342bfa587940babad2ec7622aec96994179086a5d323c479e64c890939e47f9a46b427f063f71d4f4\",\n\t\t),\n\t);\n\tconst fpModified = bls.fields.Fp.addN(fp_a, fp_b);\n\tconsole.log(\"Fp a + b: \", fpModified.toString(16));\n\n\tconst g1_a = bls.G1.ProjectivePoint.fromHex(\n\t\t\"a191b705ef18a6e4e5bd4cc56de0b8f94b1f3c908f3e3fcbd4d1dc12eb85059be7e7d801edc1856c8cfbe6d63a681c1f\",\n\t);\n\tconst g1_b = bls.G1.ProjectivePoint.fromHex(\n\t\t\"8e07730c0dceb35342bfa587940babad2ec7622aec96994179086a5d323c479e64c890939e47f9a46b427f063f71d4f4\",\n\t);\n\tconst g1_zero = bls.G1.ProjectivePoint.ZERO;\n\tconsole.log(\"G1 a: \", g1_a.toHex(true));\n\tconsole.log(\"G1 b: \", g1_b.toHex(true));\n\tconsole.log(\"G1 zero: \", g1_zero.toHex(true));\n\n\tconst g1_sum = g1_a.add(g1_b);\n\tconst g1_sub = g1_a.subtract(g1_b);\n\tconst g1_neg = g1_a.negate();\n\tconst g1_dbl = g1_a.double();\n\tconst g1_scalar_mul = g1_a.multiply(scalar);\n\tconsole.log(\"G1 a + b: \", g1_sum.toHex(true));\n\tconsole.log(\"G1 a - b: \", g1_sub.toHex(true));\n\tconsole.log(\"G1 -a: \", g1_neg.toHex(true));\n\tconsole.log(\"G1 2a: \", g1_dbl.toHex(true));\n\tconsole.log(\"G1 scalar mul: \", g1_scalar_mul.toHex(true));\n\n\t// Create an Fp2 element and do multiplication\n\tconst fp2_a = bls.fields.Fp2.create({\n\t\tc0: BigInt(\n\t\t\t\"0x848e9f7ae435bd738c33ae1f11cefb472b29a090de5ce00740b8ec1bd30fdbb27eb7e65162eed68c55e0bb03bf749857\",\n\t\t),\n\t\tc1: BigInt(\n\t\t\t\"0x0f8faa02f0dd3225ca98d8306f8efa4e3f62a13efc342f3466d3e56be5144dae68cafab0f99ddf1f04a6659806b12235\",\n\t\t),\n\t});\n\tconst fp2_b = bls.fields.Fp2.create({\n\t\tc0: BigInt(\n\t\t\t\"0xa4d21fc0921dcca8f0666f3b7530b569c2309bc13d3303a6fc3d233c58275972879c415608b6774bbbb00e10a6e47ace\",\n\t\t),\n\t\tc1: BigInt(\n\t\t\t\"0x1046aa2e6208f5d1813de823e5e3dec638bb7b82247cebeebbc70a14f1f59b9c0738b0f08120cb81d8c876579bd2391f\",\n\t\t),\n\t});\n\tconst fp2Modified = bls.fields.Fp2.addN(fp2_a, fp2_b);\n\tconsole.log(\n\t\t\"Fp2 a + b: \",\n\t\tfp2Modified.c0.toString(16),\n\t\tfp2Modified.c1.toString(16),\n\t);\n\n\tconst g2_a = bls.G2.ProjectivePoint.fromHex(\n\t\t\"848e9f7ae435bd738c33ae1f11cefb472b29a090de5ce00740b8ec1bd30fdbb27eb7e65162eed68c55e0bb03bf7498570f8faa02f0dd3225ca98d8306f8efa4e3f62a13efc342f3466d3e56be5144dae68cafab0f99ddf1f04a6659806b12235\",\n\t);\n\tconst g2_b = bls.G2.ProjectivePoint.fromHex(\n\t\t\"a4d21fc0921dcca8f0666f3b7530b569c2309bc13d3303a6fc3d233c58275972879c415608b6774bbbb00e10a6e47ace1046aa2e6208f5d1813de823e5e3dec638bb7b82247cebeebbc70a14f1f59b9c0738b0f08120cb81d8c876579bd2391f\",\n\t);\n\tconst g2_zero = bls.G2.ProjectivePoint.ZERO;\n\tconsole.log(\"G2 a: \", g2_a.toHex(true));\n\tconsole.log(\"G2 b: \", g2_b.toHex(true));\n\tconsole.log(\"G2 zero: \", g2_zero.toHex(true));\n\n\tconst g2_sum = g2_a.add(g2_b);\n\tconst g2_sub = g2_a.subtract(g2_b);\n\tconst g2_neg = g2_a.negate();\n\tconst g2_dbl = g2_a.double();\n\tconst g2_scalar_mul = g2_a.multiply(scalar);\n\tconsole.log(\"G2 a + b: \", g2_sum.toHex(true));\n\tconsole.log(\"G2 a - b: \", g2_sub.toHex(true));\n\tconsole.log(\"G2 -a: \", g2_neg.toHex(true));\n\tconsole.log(\"G2 2a: \", g2_dbl.toHex(true));\n\tconsole.log(\"G2 scalar mul: \", g2_scalar_mul.toHex(true));\n\n\t// Create an Fp12 element and do squaring\n\tconst fp12_a = hexToFp12(\n\t\t\"7b41018107fbe009aeb2ae912921bb2145b658bff588daea81a2d53a8c4aee171935fcc96fb395398ae4e4b20d937e16967f5e6a543f14a6751a869bfd22c8d96857389065eb86aa6784483efafc422ddb530f3dd76b3ce620605f6e21ee8c13f0a6b6f84a6ab78fdc1167e447c4f3a1d7cc51cf686646b7b31199d3e453c009ca949eb79696bf3d64c68a92e66fcc1514605dea849d01626006d806aca856a641993f84d2c620e6c97f4d8773c7664baee35761c576f687d6a643c3c6257b07f1f07ec6b0eb29ebaa9cb4088b29db25d2612fa604c96b3d148f0f8a954a0777b6e21f4b51f69530401651d1d0c9480ff23d5c0c0d34ede48be9c08dd6bbee77015deddac23d10eebd64ff1ecbce86a696f051fabe6c26e15e3b946afcc2b613f0b3a2126b6533792284bc5fc90a899c4c3a05b2491ce6903a9b2d85f30d630f421324492cbbbaf174cdc1a29adc110bb4891940fa9e8ad79520296819a6b6a32a578f7283c44d9c45e0c2676e0bbb4522cbdc23baebfa3cb008f43700a67207d7eb10a9d82cc576cbe3e10bac5e23613d456c18a512180869f48b52117c8dd1de9ce4728737d3239cfe829ccea8740e42c737ff961d5cff8d9ca0da3434ed909a3d362411cdb5c8e1bc917913c3cd783c3974621309d255f81c06e46132e0076209171b0ffea3ed0541e03d78856c018912927c520c56af071062972d1cb07276d8dcea9746000dbca97f78060e1815d22f5f88652aa53ae1664e449457c2e700e65efdaff38ac0a7849f4966411153dfd1befa7bab0d1889cc643e82809911\",\n\t);\n\tconst fp12_b = hexToFp12(\n\t\t\"d9b0619e9e724685d2eb06d509523870f9dfe07c7d7fb623632fc8f3ef8acd66fd9ed31a79af676ac1c2adc48ff018066f12bda4c5b225652d002ccba86315d57ebf098d35f3987a0b79f4d989c09c0c6373e58ac42c24e5a3b16d3eafa3e91020f0bfea83f3f1736732e71aac76e40399ec881a62a93426306be1e9dfc6645f1649a1d26d7d1ada5aca07c57551250749995a15db818c0aa7acb4606e7f41b65375308abbd547f7b8d90f10e1a7bfba60924a451108c8b896efa7355e14af10c096bb64e70e0c055e27e79b3b7552aa0b36bd3eace4759e13a31eabaea322bf978d2815b287e7c4d31281c85898090b57af368ceefe8be408504a0d57c542ad8e73f44211df17c89a2fd099f25895615828c884d9c31e514819d63856841601cce68807457db323e23db4bbc9a80900fb19aafd655069700db1b5d5a5753adedab2bd556fdc1774a54f0733a51e3c18f16e700f87ade824f35dde86023a5b7d816031e0eac3c4d82a80637a777969815fbd3ddcfcaf77ed7d9ad7c8c886530414d76c34808efefd57b488b065319f573a4ac806eb5da273c4320301ca6de6c682cd844f0a08c9b5e86f29431c32830d1feedf4d8bcd5d5ca90ef15084fffb98abe683d36e9de474ed069e8f72f4cdc7043cd38cb59878acef0674d0b48b8f0b9a0df326c8c7e97a5f35dcc1377f2e68d2e6076afb792db5ad38cb01158571e0c8b644e77c8d1b574653dcd73941070cd34deac7afe916952d3b67b4ad3e8993b33308c282de58e37afb28ae2afbb44f8e56b2e3ef575b67c5bc3112ccfedd07\",\n\t);\n\tconst fp12_zero = bls.fields.Fp12.ZERO;\n\tconst fp12_one = bls.fields.Fp12.ONE;\n\tconst fp12_pairing = bls.pairing(g1_a, g2_b);\n\tconst fp12_scalar_mul = bls.fields.Fp12.pow(fp12_pairing, scalar);\n\n\tconsole.log(\"Fp12 a:\", fp12ToHex(fp12_a));\n\tconsole.log(\"Fp12 b:\", fp12ToHex(fp12_b));\n\tconsole.log(\"Fp12 zero:\", fp12ToHex(fp12_zero));\n\tconsole.log(\"Fp12 one:\", fp12ToHex(fp12_one));\n\tconsole.log(\"Fp12 pairing:\", fp12ToHex(fp12_pairing));\n\tconsole.log(\"Fp12 scalar mul:\", fp12ToHex(fp12_scalar_mul));\n\n\tconst fp12_add = bls.fields.Fp12.add(fp12_a, fp12_b);\n\tconst fp12_sub = bls.fields.Fp12.sub(fp12_a, fp12_b);\n\tconst fp12_neg = bls.fields.Fp12.neg(fp12_a);\n\tconst fp12_mul = bls.fields.Fp12.mul(fp12_a, fp12_b);\n\tconst fp12_inv = bls.fields.Fp12.inv(fp12_a);\n\n\tconsole.log(\"Fp12 add:\", fp12ToHex(fp12_add));\n\tconsole.log(\"Fp12 sub:\", fp12ToHex(fp12_sub));\n\tconsole.log(\"Fp12 neg:\", fp12ToHex(fp12_neg));\n\tconsole.log(\"Fp12 mul:\", fp12ToHex(fp12_mul));\n\tconsole.log(\"Fp12 inv:\", fp12ToHex(fp12_inv));\n}\n\nfunction hexToFp12(hex: string): Fp12 {\n\tconst c0 = bls.fields.Fp6.create({\n\t\tc0: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(0, 96))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(96, 192))),\n\t\t}),\n\t\tc1: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(192, 288))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(288, 384))),\n\t\t}),\n\t\tc2: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(384, 480))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(480, 576))),\n\t\t}),\n\t});\n\tconst c1 = bls.fields.Fp6.create({\n\t\tc0: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(576, 672))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(672, 768))),\n\t\t}),\n\t\tc1: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(768, 864))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(864, 960))),\n\t\t}),\n\t\tc2: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(960, 1056))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(1056, 1152))),\n\t\t}),\n\t});\n\treturn bls.fields.Fp12.create({ c0, c1 });\n}\n\nfunction convertToCyclotomic(fp12: Fp12): Fp12 {\n\tconst p = BigInt(\n\t\t\"0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab\",\n\t); // BLS12-381 prime\n\tconst exponent = p ** BigInt(4) - p ** BigInt(2) + BigInt(1);\n\treturn bls.fields.Fp12.pow(fp12, exponent);\n}\n\nfunction fp12ToHex(fp12: Fp12): string {\n\tconst c0 = fp12.c0;\n\tconst c1 = fp12.c1;\n\treturn [\n\t\tbigintToBigEndianHex(c0.c0.c0, 48),\n\t\tbigintToBigEndianHex(c0.c0.c1, 48),\n\t\tbigintToBigEndianHex(c0.c1.c0, 48),\n\t\tbigintToBigEndianHex(c0.c1.c1, 48),\n\t\tbigintToBigEndianHex(c0.c2.c0, 48),\n\t\tbigintToBigEndianHex(c0.c2.c1, 48),\n\t\tbigintToBigEndianHex(c1.c0.c0, 48),\n\t\tbigintToBigEndianHex(c1.c0.c1, 48),\n\t\tbigintToBigEndianHex(c1.c1.c0, 48),\n\t\tbigintToBigEndianHex(c1.c1.c1, 48),\n\t\tbigintToBigEndianHex(c1.c2.c0, 48),\n\t\tbigintToBigEndianHex(c1.c2.c1, 48),\n\t].join(\"\");\n}\n\nconst testCrypt = (\n\tkzg: string,\n\tagg_key: string,\n): { encoded: string; ikm: string; ciph: Ciphertext } => {\n\ttry {\n\t\t// Validate inputs\n\t\tif (!isValidHex(kzg) || !isValidHex(agg_key)) {\n\t\t\tthrow new Error('Invalid input hex strings');\n\t\t}\n\n\t\tconst powersOfTau = decodePowersOfTau(kzg);\n\t\tconst aggregateKey = decodeAggregateKey(agg_key);\n\n\t\tconst ciph = encrypt(powersOfTau, aggregateKey, 2);\n\t\tconst encoded = encodeCiphertext(ciph);\n\t\tconst ikm = fp12ToHex(ciph.enc_key);\n\n\t\treturn { encoded, ikm, ciph };\n\t} catch (error) {\n\t\tconsole.error('Error in testCrypt:', error);\n\t\tthrow error;\n\t}\n};\n\nfunction bigintToBigEndianHex(value: bigint, length: number): string {\n\t// Convert BigInt to hex string without the '0x' prefix\n\tlet hex = value.toString(16);\n\n\t// Ensure the hex string is padded to the desired length\n\tif (hex.length > length * 2) {\n\t\tthrow new Error(\"BigInt value is too large to fit in the specified length\");\n\t}\n\n\t// Pad the hex string with leading zeros\n\thex = hex.padStart(length * 2, \"0\");\n\n\t// Convert the hex string to a byte array\n\tconst byteArray =\n\t\thex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [];\n\n\t// Reverse the byte array to get big-endian format\n\tconst reversedByteArray = byteArray.reverse();\n\n\t// Convert the reversed byte array back to a hex string\n\tconst bigEndianHex = reversedByteArray\n\t\t.map((byte) => byte.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n\n\treturn bigEndianHex;\n}\n\nfunction reverseEndianess(hex: string): string {\n\tif (hex.length % 2 !== 0) {\n\t\tthrow new Error(\"Hex string must have an even length\");\n\t}\n\treturn hex.match(/.{1,2}/g)?.reverse().join('') || '';\n}\n\nexport {\n\tdecodeAggregateKey,\n\tdecodePowersOfTau,\n\tencodeCiphertext,\n\tencrypt as ecncryptTest,\n\ttestCrypt,\n};\n","import { edwardsToMontgomeryPriv, edwardsToMontgomeryPub, x25519 } from '@noble/curves/ed25519';\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { ChaCha20Poly1305 } from \"@stablelib/chacha20poly1305\";\n\nexport const gen_stretched_key = (input: Uint8Array) => {\n const salt = new Uint8Array(32); // 32 bytes of zero\n const info = new TextEncoder().encode(\"aes_encryption\");\n return hkdf(sha256, input, salt, info, 32); // 32 bytes output key length\n};\n\nexport const gen_shared_key = (key: Uint8Array, pk: Uint8Array) => {\n const mg_key = edwardsToMontgomeryPriv(key);\n const mg_pk = edwardsToMontgomeryPub(pk);\n return x25519.getSharedSecret(mg_key, mg_pk);\n};\n\nexport const encrypt = (plaintext: Uint8Array, key: Uint8Array) => {\n const cipher = new ChaCha20Poly1305(key);\n const nonce = new Uint8Array(cipher.nonceLength);\n globalThis.crypto.getRandomValues(nonce);\n const ciphertext = cipher.seal(nonce, plaintext);\n return { ciphertext, nonce };\n};\n\nexport const decrypt = (ciphertext: Uint8Array, key: Uint8Array, nonce: Uint8Array) => {\n const cipher = new ChaCha20Poly1305(key);\n const res = cipher.open(nonce, ciphertext);\n return res;\n};\n","/**\n * Isomorphic assert utility that works in both Node.js and browser environments.\n * Replaces Node.js built-in assert for client-side compatibility.\n */\nexport function assert(\n condition: unknown,\n message?: string\n): asserts condition {\n if (!condition) {\n throw new Error(message ?? \"Assertion failed\");\n }\n}\n","import { WsProvider } from \"@polkadot/api\";\n\n/** Values the host application must supply through {@link init}. */\nexport interface PallioraConfig {\n /** WebSocket endpoint used for the chain API connection. */\n pallioraWs: string;\n /** RPC endpoint, when it differs from {@link PallioraConfig.pallioraWs}. */\n pallioraRpcUrl: string;\n /** Base URL of the cost-estimation service. */\n costEstimatorUrl: string;\n /** Base URL of the auth service that issues S3 pre-signed URLs. */\n authServiceUrl: string;\n /** AWS region of the artifact storage bucket. */\n awsRegion: string;\n /** Name of the artifact storage bucket. */\n awsS3Bucket: string;\n /** Enables debug logging. Defaults to `false`. */\n debug: boolean;\n /** Waits for finalization instead of returning once a tx is in-block. Defaults to `false`. */\n txWaitFinalization: boolean;\n}\n\ntype RequiredKey = Exclude<keyof PallioraConfig, \"debug\" | \"txWaitFinalization\">;\n\nlet config: Partial<PallioraConfig> | null = null;\nlet cachedProvider: WsProvider | null = null;\nlet cachedProviderUrl: string | null = null;\n\n/**\n * Initializes the SDK. Call this once, before any other SDK function.\n *\n * @remarks\n * Repeated calls merge into the existing configuration, so a host can supply\n * the chain endpoint at startup and storage settings later.\n */\nexport function init(options: Partial<PallioraConfig>): void {\n config = { ...config, ...options };\n}\n\n/** Whether {@link init} has been called. */\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\n/** Clears the configuration. Intended for tests. */\nexport function resetConfig(): void {\n config = null;\n cachedProvider = null;\n cachedProviderUrl = null;\n}\n\nfunction read<K extends RequiredKey>(key: K): NonNullable<PallioraConfig[K]> {\n if (!config) {\n throw new Error(\n `Palliora SDK is not initialized: cannot read \"${key}\". ` +\n `Call init({ ${key}: ... }) before using the SDK.`,\n );\n }\n\n const value = config[key];\n if (value === undefined) {\n throw new Error(\n `Palliora SDK config \"${key}\" is not set. Pass it to init({ ${key}: ... }).`,\n );\n }\n\n return value as NonNullable<PallioraConfig[K]>;\n}\n\n/** @throws when `pallioraWs` was not supplied to {@link init}. */\nexport const getPallioraWs = (): string => read(\"pallioraWs\");\n\n/** @throws when `pallioraRpcUrl` was not supplied to {@link init}. */\nexport const getPallioraRpcUrl = (): string => read(\"pallioraRpcUrl\");\n\n/** @throws when `costEstimatorUrl` was not supplied to {@link init}. */\nexport const getCostEstimatorUrl = (): string => read(\"costEstimatorUrl\");\n\n/** @throws when `authServiceUrl` was not supplied to {@link init}. */\nexport const getAuthServiceUrl = (): string => read(\"authServiceUrl\");\n\n/** @throws when `awsRegion` was not supplied to {@link init}. */\nexport const getAwsRegion = (): string => read(\"awsRegion\");\n\n/** @throws when `awsS3Bucket` was not supplied to {@link init}. */\nexport const getAwsS3Bucket = (): string => read(\"awsS3Bucket\");\n\n/** Defaults to `false` when not supplied to {@link init}. */\nexport const isDebug = (): boolean => config?.debug ?? false;\n\n/** Defaults to `false` when not supplied to {@link init}. */\nexport const waitsForFinalization = (): boolean => config?.txWaitFinalization ?? false;\n\n/**\n * Returns the shared {@link WsProvider}, creating it on first use and replacing\n * it whenever `pallioraWs` changes.\n *\n * @throws when `pallioraWs` was not supplied to {@link init}.\n */\nexport function getProvider(): WsProvider {\n const url = getPallioraWs();\n\n if (!cachedProvider || cachedProviderUrl !== url) {\n cachedProvider = new WsProvider(url, 10000);\n cachedProviderUrl = url;\n }\n\n return cachedProvider;\n}\n","import { isDebug } from \"../config\";\nimport { Hex } from \"./types\";\n \n/**\n * Converts a hex string into a Uint8Array.\n *\n * @param hex - A hex-encoded string (must contain only hexadecimal characters, without any 0x prefix).\n * @returns A Uint8Array containing the byte values represented by the hex string.\n * @throws {Error} If the provided hex string has an odd length (invalid hex string).\n *\n * @example\n * hexToUint8Array(\"ff00a1\"); // => Uint8Array [255, 0, 161]\n */\nexport function hexToUint8Array(hex: Hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string\");\n }\n const arr = new Uint8Array(hex.length / 2);\n for (let i = 0; i < arr.length; i++) {\n arr[i] = parseInt(hex.substr(i * 2, 2), 16);\n }\n return arr;\n}\n \n/**\n * Encodes a Uint8Array into a Base64 string using the browser btoa API.\n *\n * Note: This implementation builds a binary string via String.fromCharCode for each byte and then calls btoa.\n * It is intended for browser environments where btoa is available. For very large arrays consider alternative approaches to avoid high memory usage.\n *\n * @param uint8Array - The bytes to encode as Base64.\n * @returns A Base64-encoded string representing the input bytes.\n *\n * @example\n * uint8ArrayToBase64(new Uint8Array([72, 101, 108, 108, 111])); // => \"SGVsbG8=\"\n */\nexport function uint8ArrayToBase64(uint8Array: Uint8Array) {\n let binary = \"\";\n for (let i = 0; i < uint8Array.length; i++) {\n binary += String.fromCharCode(uint8Array[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decodes a Base64 (or URL-safe Base64) string into a Uint8Array.\n *\n * This function normalizes URL-safe base64 by replacing '-' with '+' and '_' with '/', and it adds padding if missing\n * before decoding with atob. Works in browser environments where atob is available.\n *\n * @param base64 - A Base64 or URL-safe Base64 encoded string.\n * @returns The decoded bytes as a Uint8Array.\n *\n * @example\n * base64ToUint8Array(\"SGVsbG8=\"); // => Uint8Array [72, 101, 108, 108, 111]\n */\nexport const base64ToUint8Array = (base64: string): Uint8Array => {\n // Convert URL-safe base64 to standard base64.\n base64 = base64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n // Add padding if missing.\n while (base64.length % 4) {\n base64 += \"=\";\n }\n const binaryString = atob(base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n};\n\n/**\n * Decodes a Base64-encoded field into a Uint8Array and handles possible double-encoding.\n *\n * If expectedLength is provided and the decoded byte length does not match, this helper checks whether the decoded result\n * is exactly twice the expected length. If so, it treats the decoded bytes as a UTF-8 string containing another Base64 value,\n * decodes that second Base64 string, and returns it if it matches the expected length. Otherwise the initially decoded bytes are returned.\n *\n * @param field - The Base64 (or URL-safe Base64) encoded field to decode.\n * @param expectedLength - Optional expected length of the final decoded byte array. When provided, enables the double-decoding heuristic.\n * @returns The decoded bytes as a Uint8Array. If double-encoding is detected and validated, the inner decoded bytes are returned.\n *\n * @example\n * // Single-encoded\n * decodeField(\"SGVsbG8=\", 5); // => Uint8Array [72, 101, 108, 108, 111]\n *\n * @example\n * // Double-encoded: base64(base64(bytes))\n * decodeField(\"U0dWc2JHOGU=\", 5); // => Uint8Array [72, 101, 108, 108, 111]\n */\nexport const decodeField = (\n field: string,\n expectedLength?: number\n): Uint8Array => {\n const bytes = base64ToUint8Array(field);\n if (expectedLength && bytes.length !== expectedLength) {\n // If we got exactly twice as many bytes as expected, assume double-encoding.\n if (bytes.length === expectedLength * 2) {\n const intermediateStr = new TextDecoder().decode(bytes);\n const secondBytes = base64ToUint8Array(intermediateStr);\n if (secondBytes.length === expectedLength) {\n return secondBytes;\n }\n }\n }\n return bytes;\n};\n\n/**\n * Conditional debug logging utility.\n * Only logs when the debug flag is enabled in config.\n * \n * @param message - The message to log\n * @param optionalParams - Additional parameters to log\n */\nexport const debugLog = (message?: any, ...optionalParams: any[]) => {\n if (isDebug()) {\n console.log(message, ...optionalParams);\n }\n};\n","import { assert } from \"./assert\";\nimport { formatUnits, parseUnits } from \"viem\";\nimport { getApi } from \"../chain\";\n\nexport const PALI_SYMBOL = \"PALI\";\nexport const PALI_DECIMALS = 18;\n\ninterface TokenProperties {\n symbol: string;\n decimals: number;\n}\n\nexport type PaliAmountInput = string | number;\nexport type AtomicPaliAmount = bigint;\n\nlet tokenCache: TokenProperties | null = null;\n\nexport const toAtomicPaliAmount = (amount: PaliAmountInput): AtomicPaliAmount => {\n const normalizedAmount = String(amount).trim();\n\n if (!normalizedAmount) {\n throw new Error(\"Token amount cannot be empty\");\n }\n\n return parseUnits(normalizedAmount, PALI_DECIMALS);\n};\n\nexport const fromAtomicPaliAmount = (amount: bigint): string => {\n return formatUnits(amount, PALI_DECIMALS);\n};\n\nexport const formatPaliAmount = (amount: bigint, symbol: string = PALI_SYMBOL): string => {\n return `${fromAtomicPaliAmount(amount)} ${symbol}`;\n};\n\n/**\n * Fetch token name and decimals from RPC system properties\n * Results are cached for subsequent calls\n * @param rpc - RPC provider instance with system.properties method\n * @returns Promise<TokenProperties> with symbol and decimals\n */\nexport async function fetchTokenProperties(): Promise<TokenProperties> {\n // Return cached value if available\n if (tokenCache) {\n return tokenCache;\n }\n\n try {\n const systemProperties = (await (await getApi())?.rpc.system.properties())?.toHuman();\n\n assert(systemProperties, \"Failed to fetch system properties from RPC\");\n\n const tokenProperties: TokenProperties = {\n symbol: (systemProperties?.tokenSymbol as string[] || [PALI_SYMBOL])[0],\n decimals: Number((systemProperties?.tokenDecimals as string[] || [String(PALI_DECIMALS)])[0]),\n };\n\n // Store in cache\n tokenCache = tokenProperties;\n\n return tokenProperties;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Get cached token properties without making an RPC call\n * @returns TokenProperties or null if not yet cached\n */\nexport function getCachedTokenProperties(): TokenProperties | null {\n return tokenCache;\n}\n\n/**\n * Clear the token properties cache\n */\nexport function clearTokenCache(): void {\n tokenCache = null;\n}\n\n/**\n * Format balance using cached token properties\n * @param balance - The balance value to format\n * @returns Formatted balance string\n */\nexport async function formatBalanceWithTokenProperties(balance: string | number | bigint): Promise<string> {\n const tokenProperties = await fetchTokenProperties();\n\n return `${formatUnits(typeof balance === \"bigint\" ? balance : BigInt(balance), tokenProperties.decimals)} ${tokenProperties.symbol}`;\n}\n\nexport const tokenToBigint = toAtomicPaliAmount;\n","/**\n * Module providing singleton access to Polkadot API, WebSocket provider, and keyring.\n *\n * This module ensures that only one instance of the WsProvider, ApiPromise and Keyring\n * are created and reused across the application. It exposes a class-based wrapper\n * (RpcApi) for managed connect/disconnect flows and convenience functions for directly\n * obtaining the singleton instances.\n *\n * Notes:\n * - The API is created with custom RPC, types and signed extensions provided by\n * {@link API_RPC}, {@link API_TYPES} and {@link API_EXTENSIONS}.\n * - In non-test environments, the module attaches fatal handlers to the API that call\n * `process.exit(0)` on error/disconnect to allow an external supervisor to restart\n * the process.\n * - The keyring is created for `sr25519` keys. The convenience getter populates a\n * default development account derived from the well-known dev URI `//Bob`\n * (named \"Bob default\"). This is a development-only seed and MUST NOT be used\n * in production.\n */\nimport { ApiPromise, Keyring, WsProvider } from \"@polkadot/api\";\nimport { API_EXTENSIONS, API_RPC, API_TYPES } from \"./spec\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getProvider, getPallioraWs } from \"../config\";\n\n// Create singleton instances\nlet wsProvider: WsProvider | null = null;\nlet api: ApiPromise | null = null;\nlet apiUrl: string | null = null;\nlet keyring: Keyring | null = null;\n// Separate keyring instance intended for encryption-related keys/usages.\nlet encKeyring: Keyring | null = null;\nlet apiListenersAttached = false;\nlet apiTeardownInProgress = false;\n\n/**\n * getApi()\n *\n * Returns the singleton {@link ApiPromise} instance, creating it if necessary.\n *\n * @remarks\n * - Throws if the SDK has not been initialized with a `pallioraWs` endpoint\n * (see `init` in \"../config\").\n * - When creating the API, the configured `rpc`, `types` and `signedExtensions`\n * are applied.\n * - In non-test environments, top-level API `error` and `disconnected` events\n * cause the process to exit so that an external supervisor can restart the\n * process.\n *\n * @param cb - Optional callback function to attach to the \"disconnected\" event.\n *\n * @returns The singleton {@link ApiPromise} instance.\n */\nexport async function getApi(cb?: () => void) {\n const pallioraWs = getPallioraWs();\n\n if (api && pallioraWs !== apiUrl) {\n const staleApi = api;\n api = null;\n apiUrl = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n await staleApi.disconnect().catch(() => {});\n }\n\n if (!api) {\n api = await ApiPromise.create({\n provider: getProvider(),\n rpc: API_RPC,\n types: API_TYPES,\n signedExtensions: API_EXTENSIONS,\n });\n apiUrl = pallioraWs;\n }\n const isNode = typeof process !== \"undefined\" && typeof process.exit === \"function\";\n const isTest = typeof process !== \"undefined\" && process.env?.NODE_ENV === \"test\";\n if (isNode && !isTest && api && !apiListenersAttached) {\n apiListenersAttached = true;\n api.on(\"error\", (err) => {\n if (apiTeardownInProgress) return;\n apiTeardownInProgress = true;\n apiListenersAttached = false;\n\n const currentApi = api;\n api = null;\n\n void currentApi?.disconnect().catch((disconnectErr) => {\n apiTeardownInProgress = false;\n console.error(\"api disconnect after error failed:\", disconnectErr);\n });\n });\n api.on(\"disconnected\", () => {\n api = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n if (cb) cb();\n });\n }\n return api;\n}\n\n/**\n * disconnectApi()\n *\n * Tears down the singleton {@link ApiPromise} instance, if one exists.\n *\n * @remarks\n * Safe to call when no API has been created yet (no-op). After this resolves,\n * the next call to {@link getApi} creates a fresh instance.\n */\nexport async function disconnectApi() {\n if (!api) return;\n\n const current = api;\n api = null;\n apiUrl = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n\n await current.disconnect().catch(() => {});\n}\n\n/**\n * getKeyring()\n *\n * Returns the singleton {@link Keyring} instance, creating it if necessary.\n *\n * @remarks\n * - Ensures {@link waitReady} has resolved before constructing the keyring so\n * that WASM crypto is initialized.\n * - The keyring is created with `type: \"sr25519\"`.\n * - The function also adds a default development account from the dev seed URI\n * `//Bob` and labels it \"Bob default\".\n *\n * @important\n * The seed URI `//Bob` is a well-known development seed. It is convenient for\n * local testing but is insecure for any real funds or production use. Replace\n * or remove this default account when deploying to production.\n *\n * @returns The singleton {@link Keyring} instance.\n */\nexport async function getKeyring() {\n if (!keyring) {\n await waitReady();\n keyring = new Keyring({ type: \"sr25519\" });\n keyring.addFromUri('//Bob', { name: 'Bob default' });\n }\n return keyring;\n}\n\n/**\n * getEncKeyring()\n *\n * Returns the singleton encryption-focused {@link Keyring} instance, creating it\n * if necessary.\n *\n * @remarks\n * - Ensures {@link waitReady} has resolved before constructing the keyring so\n * that WASM crypto is initialized.\n * - The keyring is created with `type: \"sr25519\"` and a development default\n * account derived from the dev seed URI `//Bob` is added and labeled\n * \"Bob default (enc)\".\n *\n * @important\n * The seed URI `//Bob` is a well-known development seed and MUST NOT be used\n * in production for real funds. Replace or remove this default when deploying\n * to production.\n *\n * @returns The singleton {@link Keyring} instance used for encryption keys.\n */\nexport async function getEncKeyring() {\n if (!encKeyring) {\n await waitReady();\n encKeyring = new Keyring({ type: \"ed25519\" });\n encKeyring.addFromUri('//Bob', { name: 'Bob default (enc)' });\n }\n return encKeyring;\n}\n","import { waitsForFinalization } from \"../config\";\nimport { getApi } from \"./singleton\";\nimport { isFunction } from \"@polkadot/util\";\nimport { DEFAULT_COMPUTE_PAYLOAD } from \"./spec\";\nimport bs58 from \"bs58\";\nimport { getGuardianList } from \"../guardian\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { ISubmittableResult } from \"@polkadot/types/types\";\nimport type { EventRecord } from \"@polkadot/types/interfaces\";\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { Header, SignedBlock } from \"@polkadot/types/interfaces\";\nimport { AgreementStatus, ContractInfo, ContractType, SubmissionReceipt } from \"./types\";\n\n/** ISubmittableResult extended with the concrete blockNumber present after finalization */\ninterface SubmittableResultExtended extends ISubmittableResult {\n readonly blockNumber?: { toNumber(): number };\n}\n\nexport const signAndSend = async (request: SubmittableExtrinsic<'promise'>, account: KeyringPair, opts: Record<string, unknown> = DEFAULT_COMPUTE_PAYLOAD) => {\n // currencyId feeds ChargeCurrencyTransactionPayment's extra field; null (None) pays\n // fees in the native currency, matching pre-upgrade behavior. Callers may override.\n const signOpts = { currencyId: null, ...opts };\n const tx_result: SubmittableResultExtended = await new Promise((res, err) => {\n // opts contains custom chain-specific fields (daType, compute, etc.) that extend SignerOptions\n request.signAndSend(account, signOpts as Parameters<typeof request.signAndSend>[1], (result: SubmittableResultExtended) => {\n // console.trace(result.toHuman());\n if (result.isFinalized) {\n res(result);\n }\n if (!waitsForFinalization() && result.isInBlock) {\n res(result);\n }\n if (result.isError) err(result);\n });\n });\n // console.trace(tx_result.toHuman());\n\n if (tx_result.isError) {\n throw new Error(`Transaction failed with error: ${tx_result.dispatchError}`);\n }\n\n if (tx_result.dispatchError) {\n throw new Error(\n `Transaction dispatched with error: ${tx_result.dispatchError}`\n );\n }\n\n console.debug(\n `Transaction ${tx_result.txHash.toHex()} included in timepoint ${\n tx_result.blockNumber\n }-${tx_result.txIndex}`\n );\n\n return {\n blockNumber: tx_result.blockNumber?.toNumber() ?? 0,\n index: tx_result.txIndex ?? 0,\n hash: tx_result.txHash.toHex(),\n tx_result: tx_result as ISubmittableResult,\n };\n};\n\n/**\n * Retries {@link signAndSend} with exponential backoff, for RPC endpoints that\n * intermittently drop connections or time out mid-submission.\n *\n * @param request Unsigned extrinsic to submit\n * @param account Signing account\n * @param opts Extra signer options, forwarded to `signAndSend` (see its defaults)\n * @param retries Number of retry attempts after the initial try (default 3)\n * @param backoffMs Base delay before the first retry; doubles each subsequent attempt (default 1000)\n */\nexport const retrySignAndSend = async (\n request: SubmittableExtrinsic<'promise'>,\n account: KeyringPair,\n opts?: Record<string, unknown>,\n retries = 3,\n backoffMs = 1000,\n) => {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await signAndSend(request, account, opts);\n } catch (err) {\n lastError = err;\n if (attempt === retries) break;\n\n const delay = backoffMs * 2 ** attempt;\n debugLog(`retrySignAndSend: attempt ${attempt + 1} failed, retrying in ${delay}ms`, err);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n};\n\nexport const getFileMetadataCall = async (\n api: ApiPromise,\n metadataRef: [number, number]\n) => {\n const block = await getBlock(api, metadataRef[0]);\n const call = block.block.extrinsics[metadataRef[1]];\n return call.method;\n};\n\nconst getBlock = async (api: ApiPromise, blockNumber: number) => {\n const blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n return await api.rpc.chain.getBlock(blockHash);\n};\n\nexport const getGuardianAddress = async () => {\n const api = await getApi();\n\n if (!api) throw new Error(\"API not initialized\");\n assert(\n isFunction(api.query[\"guardian\"]?.[\"workerByKey\"]),\n `api.query.guardian.workerByKey does not exist`,\n );\n\n const list = await getGuardianList();\n\n const addresses = await Promise.all(\n list.map(async (item) => {\n const peerid = bs58.decode(item).slice(6, 38);\n return ((await api.query[\"guardian\"][\"workerByKey\"](peerid)).toString());\n })\n );\n\n return list.map((peerid, index) => ({ peerid, address: addresses[index] }));\n};\n\nexport const getGuardianNwParams = async () => {\n try {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const rpc = api.rpc as unknown as Record<\n string,\n Record<string, (...params: unknown[]) => Promise<unknown>>\n >;\n const section = \"guardian\";\n const method = \"guardianNwParams\";\n\n assert(\n isFunction(rpc[section]?.[method]),\n `api.rpc.${section}.guardianNwParams does not exist`\n );\n\n const guardianNwParams = (await rpc[section][method]()) as Record<\n string,\n unknown\n >;\n if (\n typeof guardianNwParams === \"object\" &&\n guardianNwParams !== null &&\n \"kzg\" in guardianNwParams\n ) {\n return (guardianNwParams.kzg as { toHex(): string }).toHex().slice(2);\n } else {\n throw new Error(`Invalid ${guardianNwParams} format`);\n }\n } catch (error) {\n console.error({ error });\n throw error;\n }\n};\n\n/**\n * Reads back the on-chain record for an agreement/contract created via\n * `createAgreement`, from `compute.contracts`.\n *\n * @param contractId - Hex-encoded agreement ID (as returned by `createAgreement`).\n * @returns The decoded {@link ContractInfo}, or `null` if no contract exists for that ID.\n */\nexport async function getContractInfo(contractId: string): Promise<ContractInfo | null> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n assert(\n isFunction(api.query[\"compute\"]?.[\"contracts\"]),\n `api.query.compute.contracts does not exist`,\n );\n\n const raw = await api.query[\"compute\"][\"contracts\"](contractId);\n const info = raw.toPrimitive() as {\n status: AgreementStatus;\n owner: string;\n originBlock: number;\n invocationBlock: number;\n index: number;\n usagePrice: number | string;\n contractType: ContractType;\n } | null;\n\n if (!info) return null;\n\n return {\n status: info.status,\n owner: info.owner,\n originBlock: info.originBlock,\n invocationBlock: info.invocationBlock,\n index: info.index,\n usagePrice: BigInt(info.usagePrice),\n contractType: info.contractType,\n };\n}\n\n/**\n * Fetches the block at `blockHeight`, extracts the extrinsic at\n * `extrinsicIndex`, and returns both the raw codec object and its human-readable\n * decoded form.\n *\n * Throws if the block cannot be found or the index is out of range.\n */\nexport async function fetchAndDecodeExtrinsic(\n blockHeight: number,\n extrinsicIndex: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<{ raw: any; decoded: Record<string, unknown> }> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const blockHash = await api.rpc.chain.getBlockHash(blockHeight);\n const signedBlock = await api.rpc.chain.getBlock(blockHash);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n if (extrinsicIndex >= extrinsics.length) {\n throw new Error(\n `extrinsic index ${extrinsicIndex} out of range — ` +\n `block ${blockHeight} has ${extrinsics.length} extrinsics`,\n );\n }\n\n const raw = extrinsics[extrinsicIndex];\n const decoded = raw.toHuman() as Record<string, unknown>;\n\n return { raw, decoded };\n}\n\n/**\n * Finds the first event record matching `section`/`method` (case-insensitive)\n * among a transaction's emitted events, e.g. `tx_result.events` from {@link signAndSend}.\n */\nexport function findEvent(\n events: EventRecord[],\n section: string,\n method: string,\n): EventRecord | undefined {\n return events.find(\n (record) =>\n record.event.section.toLowerCase() === section.toLowerCase() &&\n record.event.method.toLowerCase() === method.toLowerCase(),\n );\n}\n\nexport type BlockScanFilter =\n | {\n /** Pallet name, e.g. \"dataAvailability\" (case-insensitive) */\n section: string;\n /** Event name, e.g. \"DaccGuardianGroup\" (case-insensitive) */\n method: string;\n predicate?: never;\n }\n | {\n /**\n * Custom predicate called for every event record in each scanned block.\n * The full signed block is pre-fetched before any predicate call.\n * Return true to accept the match and resolve, false to skip and keep scanning.\n */\n predicate: (block: SignedBlock, event: EventRecord['event'], phase: EventRecord['phase']) => boolean | Promise<boolean>;\n section?: never;\n method?: never;\n };\n\nexport type BlockScanResult = {\n blockHash: string;\n blockNumber: number;\n /** Index of the extrinsic that emitted the event, or null for inherents */\n extrinsicIndex: number | null;\n /** Returns the full signed block; cached when predicate mode was used */\n block: () => Promise<SignedBlock>;\n /** All event records for this block */\n events: EventRecord[];\n};\n\n/**\n * Subscribes to new block headers and resolves with a match descriptor as soon\n * as a qualifying event is found.\n *\n * Supply exactly one of:\n * - `section` + `method` — lightweight name match, no block fetch\n * - `predicate(block, event, phase)` — full control; block is pre-fetched\n *\n * @param api Connected ApiPromise instance\n * @param filter Either a name filter or a predicate (mutually exclusive)\n * @param startBlock Ignore blocks with a number strictly below this value\n * @param maxBlocks Reject after scanning this many blocks; pass 0 to wait indefinitely (default 20)\n */\nexport const scanForBlockEvent = (\n api: ApiPromise,\n filter: BlockScanFilter,\n startBlock?: number,\n maxBlocks = 20\n): Promise<BlockScanResult> => {\n const hasPredicate = \"predicate\" in filter;\n let blocksScanned = 0;\n let done = false;\n\n return new Promise((resolve, reject) => {\n const unsubPromise: Promise<() => void> = api.rpc.chain.subscribeNewHeads(\n async (header: Header) => {\n if (done) return;\n\n const currentBlock: number = header.number.toNumber();\n if (startBlock !== undefined && currentBlock < startBlock) return;\n\n blocksScanned++;\n if (maxBlocks > 0 && blocksScanned > maxBlocks) {\n done = true;\n unsubPromise.then((unsub) => unsub());\n reject(new Error(`No matching event found within ${maxBlocks} blocks`));\n return;\n }\n\n try {\n const blockHash = await api.rpc.chain.getBlockHash(currentBlock);\n\n // Pre-fetch block when using predicate so the caller can inspect extrinsics\n const eventsResult = await api.query.system.events.at(blockHash);\n const events = eventsResult as unknown as EventRecord[];\n const blockData: SignedBlock | null = await (hasPredicate ? api.rpc.chain.getBlock(blockHash) : Promise.resolve(null));\n\n for (const record of events) {\n const { event, phase } = record;\n\n const matched: boolean = hasPredicate\n ? await (filter as { predicate: Function }).predicate(blockData, event, phase)\n : event.section.toLowerCase() === (filter as { section: string; method: string }).section.toLowerCase() &&\n event.method.toLowerCase() === (filter as { section: string; method: string }).method.toLowerCase();\n\n if (!matched) continue;\n\n done = true;\n unsubPromise.then((unsub) => unsub());\n resolve({\n blockHash: blockHash.toHex(),\n blockNumber: currentBlock,\n extrinsicIndex: phase.isApplyExtrinsic ? phase.asApplyExtrinsic.toNumber() : null,\n block: blockData ? () => Promise.resolve(blockData) : () => api.rpc.chain.getBlock(blockHash),\n events,\n });\n return;\n }\n } catch (err) {\n debugLog(`scanForBlockEvent: error scanning block ${currentBlock}: ${err}`);\n }\n }\n );\n });\n};\n\n/**\n * Resolves as soon as the next block header is produced. Useful as a plain\n * polling tick, e.g. between rounds of a manual wait loop.\n */\nexport async function waitForNextBlock(): Promise<{ blockNumber: number; blockHash: string }> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n return new Promise((resolve, reject) => {\n let unsubFn: (() => void) | undefined;\n let settled = false;\n\n api.rpc.chain.subscribeNewHeads((header: Header) => {\n if (settled) return;\n settled = true;\n unsubFn?.();\n resolve({ blockNumber: header.number.toNumber(), blockHash: header.hash.toHex() });\n }).then((fn) => {\n if (settled) fn();\n else unsubFn = fn;\n }).catch((err) => {\n if (!settled) {\n settled = true;\n reject(err);\n }\n });\n });\n}\n\n/**\n * Subscribes to new block headers and scans each block's extrinsics until a\n * `compute.result` extrinsic matching `requestId` is found. Resolves with the\n * {@link SubmissionReceipt} (extrinsic hash, block height, and extrinsic index).\n *\n * The result-relay submits the extrinsic asynchronously, so this watcher may\n * need to observe several blocks before the tx lands.\n *\n * @param requestId - The hex-encoded request ID to match (e.g. \"0xabc123…\").\n * @param timeoutMs - Milliseconds to wait before giving up (default: 10 min).\n */\nexport async function watchForSubmissionReceipt(\n requestId: string,\n timeoutMs = 10 * 60 * 1_000,\n): Promise<SubmissionReceipt> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n return new Promise<SubmissionReceipt>((resolve, reject) => {\n let unsubFn: (() => void) | undefined;\n let settled = false;\n\n const cleanup = (settleFn: () => void) => {\n if (settled) return;\n settled = true;\n unsubFn?.();\n settleFn();\n };\n\n const timer = setTimeout(\n () => cleanup(() => reject(new Error(`receipt watch timed out for requestId=${requestId}`))),\n timeoutMs,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.rpc.chain.subscribeNewHeads(async (header: any) => {\n if (settled) return;\n try {\n const blockNumber: number = header.number.toNumber();\n const blockHash = header.hash;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const signedBlock: any = await api.rpc.chain.getBlock(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n\n for (let i = 0; i < extrinsics.length; i++) {\n const ext = extrinsics[i];\n const decoded = ext.toHuman() as Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const method = decoded?.method as any;\n\n if (\n String(method?.section ?? '').toLowerCase() === 'compute' &&\n String(method?.method ?? '').toLowerCase() === 'result'\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const args = method?.args as any;\n // The first argument to compute.result is the request ID.\n const onChainId = String(args?.request_id ?? args?.requestId ?? args?.[0] ?? '');\n\n if (onChainId === requestId) {\n clearTimeout(timer);\n cleanup(() =>\n resolve({\n extrinsicHash: (ext.hash as { toHex(): string }).toHex(),\n blockHeight: blockNumber,\n extrinsicIndex: i,\n }),\n );\n return;\n }\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[watchReceipt] block check failed requestId=${requestId}: ${msg}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }).then((fn: any) => {\n if (settled) {\n // Already resolved/rejected before the subscribe promise returned — unsub now.\n (fn as () => void)();\n } else {\n unsubFn = fn as () => void;\n }\n }).catch((err: unknown) => {\n clearTimeout(timer);\n cleanup(() => reject(err));\n });\n });\n}\n\n/**\n * Fetches block events at `blockHeight` and returns the request ID from the\n * `compute.AgreementCreated` event emitted by the extrinsic at `extrinsicIndex`.\n * Returns `null` if no matching event is found for that extrinsic.\n */\nexport async function getAgreementCreatedRequestId(\n blockHeight: number,\n extrinsicIndex: number,\n): Promise<string | null> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const blockHash = await api.rpc.chain.getBlockHash(blockHeight);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const apiAt = await api.at(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allEvents = (await apiAt.query.system.events()) as unknown as EventRecord[];\n\n // Only consider events produced by the extrinsic at our index.\n const extrinsicEvents = allEvents.filter(\n (record) => record.phase.isApplyExtrinsic && record.phase.asApplyExtrinsic.toNumber() === extrinsicIndex,\n );\n\n const match = findEvent(extrinsicEvents, \"compute\", \"AgreementCreated\");\n if (!match) return null;\n\n // Decode event data and extract the request ID.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dataHuman = match.event.data.toHuman() as Record<string, unknown> | unknown[];\n if (Array.isArray(dataHuman)) {\n const first = dataHuman[0];\n if (first != null) return String(first);\n } else if (dataHuman !== null && typeof dataHuman === 'object') {\n const id = dataHuman['requestId'] ?? dataHuman['request_id'] ?? dataHuman['id'];\n if (id != null) return String(id);\n }\n\n return null;\n}\n","import type { ApiPromise } from \"@polkadot/api\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getApi } from \"../chain\";\nimport { isFunction } from \"@polkadot/util\";\nimport { assert } from \"../utils\";\n\nexport const getGuardianList = async () => {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const rpc = api.rpc as unknown as Record<\n string,\n Record<string, (...params: unknown[]) => Promise<unknown>>\n >;\n const section = \"guardian\";\n const method = \"guardianList\";\n\n assert(\n isFunction(rpc[section]?.[method]),\n `api.rpc.${section}.${method} does not exist`,\n );\n\n const list = ((await rpc[section][\"guardianList\"]()) as Array<Text>)\n .map((item) => [item.toString()])\n .flat(1);\n\n return list;\n};\n\nexport interface ActiveGuardian {\n account: string;\n guardianPrefs: Record<string, unknown> | null;\n stakersOverview: Record<string, unknown> | null;\n}\n\n/**\n * Current-era on-chain guardians with staking prefs and ledger totals.\n * Does not disconnect the shared API.\n */\nexport async function getActiveGuardians(\n apiInstance?: ApiPromise,\n): Promise<ActiveGuardian[]> {\n await waitReady();\n const api = apiInstance ?? (await getApi());\n if (!api) throw new Error(\"API not initialized\");\n\n const guardians = await api.query.guardian.guardians();\n const accounts = (guardians?.toJSON() || []) as string[];\n\n return Promise.all(\n accounts.map(async (account) => {\n const [prefs, ledger] = await Promise.all([\n api.query.staking.guardians(account),\n api.query.staking.ledger(account),\n ]);\n\n return {\n account,\n guardianPrefs: (prefs?.toHuman?.() as Record<string, unknown>) ?? null,\n stakersOverview: (ledger?.toHuman?.() as Record<string, unknown>) ?? null,\n };\n }),\n );\n}\n","import { getApi, getGuardianNwParams, signAndSend, scanForBlockEvent, fetchAndDecodeExtrinsic } from \"../chain\";\nimport { GuardianGroupInfo, OnChainRef } from \"..\";\nimport { hexToUint8Array, debugLog, assert } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { GuardianAddress } from \"../da/types\";\n\nexport const createGuardianGroup = async (account: KeyringPair, selectedGuardians: GuardianAddress[]) => {\n try {\n const api = await getApi();\n\n assert(selectedGuardians.length >= 3, \"Not enough guardians available to create a group\");\n assert(account, \"Failed to load account\");\n assert(api, \"Failed to initialize API\");\n\n const tau_params = await getGuardianNwParams();\n assert(tau_params && tau_params !== \"\", \"Failed to retrieve guardian network parameters\");\n\n // For simplicity, select the first 3 guardians\n debugLog(`Selected guardians: ${selectedGuardians.join(\", \")} and tau_params: ${tau_params}`);\n\n // Create and send the transaction\n const tx = api.tx.dataAvailability.daccGuardianGroup(\n selectedGuardians,\n Array.from(hexToUint8Array(tau_params as `0x${string}`)) // Use the new helper function\n );\n const result = await signAndSend(tx, account);\n\n debugLog(\"Guardian group created:\", result);\n return result;\n } catch (error) {\n console.error(\"Error creating guardian group:\", error);\n throw new Error(`Failed to create guardian group: ${error instanceof Error ? error.message : error}`);\n }\n};\n\n/**\n * Creates a guardian group with exactly 3 guardians, waits for tx confirmation,\n * then watches incoming blocks for the `DaccGuardianGroup` event (emitted by a\n * subsequent `daccGuardianGroupInfo` extrinsic) and returns the decoded args.\n *\n * @param account Signing account\n * @param guardians Exactly 3 guardian addresses / peer-ids\n * @param maxBlocks Give up waiting for the event after this many blocks; 0 = indefinite (default 20)\n */\nexport const createGuardianGroupAndWatch = async (\n account: KeyringPair,\n guardians: GuardianAddress[],\n maxBlocks = 20\n): Promise<GuardianGroupInfo> => {\n assert(guardians.length === 3, \"Exactly 3 guardians are required\");\n assert(account, \"Failed to load account\");\n\n const api = await getApi();\n assert(api, \"Failed to initialize API\");\n\n debugLog(`Submitting guardian group creation...`);\n // daccGuardianGroup emits DaccGuardianGroup with empty group_pk/tau_params/agg_key.\n // Start listening from the next block so we only catch the DaccGuardianGroup event\n // emitted by the subsequent daccGuardianGroupInfo extrinsic.\n const creationResult = await createGuardianGroup(account, guardians);\n const startBlock: number = (creationResult?.blockNumber ?? 0) + 1;\n debugLog(`Group creation tx confirmed at block ${startBlock - 1}. Listening for DaccGuardianGroup event from block ${startBlock}...`);\n\n const match = await scanForBlockEvent(\n api,\n {\n predicate: async (block, event, phase) => {\n if (\n event.section.toLowerCase() !== \"dataavailability\" ||\n event.method.toLowerCase() !== \"daccguardiangroup\"\n ) return false;\n if (!phase.isApplyExtrinsic) return false;\n const ext = block.block.extrinsics[phase.asApplyExtrinsic.toNumber()];\n return (\n ext?.method?.section?.toLowerCase() === \"dataavailability\" &&\n ext?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\"\n );\n },\n },\n startBlock,\n maxBlocks\n );\n\n // Block is pre-fetched by scanForBlockEvent when using predicate mode\n assert(match.extrinsicIndex !== null, \"DaccGuardianGroup event was not emitted by an extrinsic\");\n debugLog(`DaccGuardianGroup event found at block ${match.blockNumber}, extrinsic index ${match.extrinsicIndex}. Decoding args...`);\n\n const block = await match.block();\n const ext = block.block.extrinsics[match.extrinsicIndex];\n\n // daccGuardianGroupInfo(group_id: H256, group_pk: AppData, tau_params: AppData, agg_key: AppData)\n const [group_id, group_pk, tau_params, agg_key] = ext.method.args;\n debugLog(`Guardian group parameters decoded: group_id=${group_id.toHex()}`);\n\n return {\n groupId: group_id.toHex(),\n groupPk: group_pk.toHex(),\n tauParams: tau_params.toHex(),\n aggKey: agg_key.toHex(),\n guardians,\n };\n};\n\n/**\n * Walks blocks forward from `startBlock`, fetching each directly via RPC (not a\n * live subscription), looking for the first `dataAvailability.daccGuardianGroupInfo`\n * extrinsic. Needed because {@link scanForBlockEvent} only observes new block headers\n * and cannot find an extrinsic that already landed on-chain.\n *\n * @param maxBlocks Give up after scanning this many blocks; 0 = scan to current chain tip\n */\nasync function findGuardianGroupInfoExtrinsic(\n api: ApiPromise,\n startBlock: number,\n maxBlocks: number\n): Promise<OnChainRef> {\n const tip = (await api.rpc.chain.getHeader()).number.toNumber();\n const endBlock = maxBlocks > 0 ? Math.min(startBlock + maxBlocks - 1, tip) : tip;\n\n for (let blockNumber = startBlock; blockNumber <= endBlock; blockNumber++) {\n const blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const signedBlock: any = await api.rpc.chain.getBlock(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n\n for (let index = 0; index < extrinsics.length; index++) {\n const ext = extrinsics[index];\n if (\n ext?.method?.section?.toLowerCase() === \"dataavailability\" &&\n ext?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\"\n ) {\n return { blockNumber, index };\n }\n }\n }\n\n throw new Error(\n `No daccGuardianGroupInfo extrinsic found in blocks ${startBlock}-${endBlock} ` +\n `(searched ${Math.max(endBlock - startBlock + 1, 0)} block(s) after the creation extrinsic)`\n );\n}\n\n/**\n * Reconstructs a guardian group's full crypto params from the two on-chain\n * extrinsics that together define it. There is no direct RPC to query group\n * info by ID, so this reads it back from where it was written:\n *\n * - `dataAvailability.daccGuardianGroup(selectedGuardians, tauParams)` — the\n * creation extrinsic; carries the guardian list.\n * - `dataAvailability.daccGuardianGroupInfo(groupId, groupPk, tauParams, aggKey)`\n * — the result extrinsic (submitted separately once the group's crypto\n * params are computed); carries the actual group_id/group_pk/tau_params/agg_key.\n *\n * `groupId` isn't a required input — like {@link createGuardianGroupAndWatch},\n * it's derived from decoding the result extrinsic, not supplied by the caller.\n *\n * @param creationRef Block number + extrinsic index of the group creation extrinsic\n * @param resultRef Block number + extrinsic index of the group creation result\n * extrinsic. If omitted, blocks are scanned forward from\n * `creationRef` to find it (see `maxBlocks`).\n * @param maxBlocks Only used when `resultRef` is omitted. Give up scanning after\n * this many blocks; 0 = scan to current chain tip (default 20)\n */\nexport const getGuardianGroupInfo = async (\n creationRef: OnChainRef,\n resultRef?: OnChainRef,\n maxBlocks = 20\n): Promise<GuardianGroupInfo> => {\n assert(creationRef, \"Group creation extrinsic reference is required\");\n\n const api = await getApi();\n assert(api, \"Failed to initialize API\");\n\n debugLog(`Reading guardian group creation extrinsic at block ${creationRef.blockNumber}, index ${creationRef.index}...`);\n const { raw: creationExt } = await fetchAndDecodeExtrinsic(creationRef.blockNumber, creationRef.index);\n assert(\n creationExt?.method?.section?.toLowerCase() === \"dataavailability\" &&\n creationExt?.method?.method?.toLowerCase() === \"daccguardiangroup\",\n `Extrinsic at block ${creationRef.blockNumber}, index ${creationRef.index} is not a daccGuardianGroup call ` +\n `(found ${creationExt?.method?.section}.${creationExt?.method?.method})`\n );\n\n // daccGuardianGroup(selected_guardians: Vec<GuardianAddress>, tau_params: AppData)\n const [selectedGuardiansArg] = creationExt.method.args;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const guardians = (Array.from(selectedGuardiansArg) as any[]).map((g) => g.toString()) as GuardianAddress[];\n debugLog(`Guardian group creation extrinsic decoded: guardians=${guardians.join(\", \")}`);\n\n const resolvedResultRef =\n resultRef ??\n (await (async () => {\n debugLog(\n `No result extrinsic reference given, scanning forward from block ${creationRef.blockNumber + 1} for daccGuardianGroupInfo...`\n );\n return findGuardianGroupInfoExtrinsic(api, creationRef.blockNumber + 1, maxBlocks);\n })());\n\n debugLog(`Reading guardian group result extrinsic at block ${resolvedResultRef.blockNumber}, index ${resolvedResultRef.index}...`);\n const { raw: resultExt } = await fetchAndDecodeExtrinsic(resolvedResultRef.blockNumber, resolvedResultRef.index);\n assert(\n resultExt?.method?.section?.toLowerCase() === \"dataavailability\" &&\n resultExt?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\",\n `Extrinsic at block ${resolvedResultRef.blockNumber}, index ${resolvedResultRef.index} is not a daccGuardianGroupInfo call ` +\n `(found ${resultExt?.method?.section}.${resultExt?.method?.method})`\n );\n\n // daccGuardianGroupInfo(group_id: H256, group_pk: AppData, tau_params: AppData, agg_key: AppData)\n const [group_id, group_pk, tau_params, agg_key] = resultExt.method.args;\n debugLog(`Guardian group result extrinsic decoded: group_id=${group_id.toHex()}`);\n\n return {\n groupId: group_id.toHex(),\n groupPk: group_pk.toHex(),\n tauParams: tau_params.toHex(),\n aggKey: agg_key.toHex(),\n guardians,\n };\n};\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\n/** Classes of compute a guardian can declare a fee threshold against. */\nexport const COMPUTE_TYPES = [\"trusted\", \"tee\", \"mpc\", \"fhe\", \"zkp\"] as const;\n\nexport type ComputeType = (typeof COMPUTE_TYPES)[number];\n\n/** A rate in atomic units, already converted from PALI by the caller. */\nexport type FeeThresholdInput = bigint | string | number;\n\nconst CHAIN_COMPUTE_TYPE: Record<ComputeType, string> = {\n trusted: \"Trusted\",\n tee: \"Tee\",\n mpc: \"Mpc\",\n fhe: \"Fhe\",\n zkp: \"Zkp\",\n};\n\nexport interface GuardianJoinPrefs {\n compute?: string;\n /**\n * Minimum rate to take work on at, in atomic units. A single amount applies to every\n * compute type named in `compute`; a per-type record prices each one separately.\n * Compute types left unpriced carry no threshold on chain, which reads as zero — the\n * guardian accepts any rate for them.\n */\n fee?: FeeThresholdInput | Partial<Record<ComputeType, FeeThresholdInput>>;\n standard?: boolean;\n verifier?: boolean;\n}\n\nfunction parseComputeTypes(compute: string | undefined): ComputeType[] {\n const requested = (compute || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n // Filtering the canonical list drops duplicates, which `staking.guard` rejects.\n return COMPUTE_TYPES.filter((type) => requested.includes(type));\n}\n\nfunction buildFeeThresholds(\n fee: GuardianJoinPrefs[\"fee\"],\n computeTypes: ComputeType[],\n): [string, bigint][] {\n if (fee === undefined || fee === null || fee === \"\") {\n return [];\n }\n\n if (typeof fee !== \"object\") {\n assert(\n computeTypes.length > 0,\n \"A single fee threshold needs compute preferences to apply to. Set compute preferences, or declare thresholds per compute type.\",\n );\n return computeTypes.map((type) => [CHAIN_COMPUTE_TYPE[type], BigInt(fee)]);\n }\n\n return Object.entries(fee).map(([type, amount]) => {\n assert(\n (COMPUTE_TYPES as readonly string[]).includes(type),\n `Unknown compute type \"${type}\" in fee thresholds. Allowed: ${COMPUTE_TYPES.join(\", \")}`,\n );\n assert(\n computeTypes.includes(type as ComputeType),\n `Fee threshold declared for \"${type}\", which is not among the compute preferences (${computeTypes.join(\", \") || \"none\"})`,\n );\n return [CHAIN_COMPUTE_TYPE[type as ComputeType], BigInt(amount as FeeThresholdInput)];\n });\n}\n\nexport async function joinGuardian(account: KeyringPair, prefs: GuardianJoinPrefs) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const computeTypes = parseComputeTypes(prefs.compute);\n const feeThresholds = buildFeeThresholds(prefs.fee, computeTypes);\n\n const guardianPrefs = {\n pubKey: account.publicKey,\n guardian: prefs.standard,\n verifier: prefs.verifier,\n compute: prefs.compute ? true : false,\n computePrefs: {\n trusted: computeTypes.includes(\"trusted\"),\n tee: computeTypes.includes(\"tee\"),\n mpc: computeTypes.includes(\"mpc\"),\n fhe: computeTypes.includes(\"fhe\"),\n zkp: computeTypes.includes(\"zkp\"),\n },\n feeThresholds,\n };\n\n debugLog(\n account.address,\n \"joining as guardian with preferences:\",\n {\n ...guardianPrefs,\n feeThresholds: feeThresholds.map(\n ([type, threshold]) => `${type}: ${formatPaliAmount(threshold)}`,\n ),\n }\n );\n\n const guardTx = api.tx.staking.guard(guardianPrefs);\n const hash = await signAndSend(guardTx, account);\n\n debugLog(\"Guardian join tx sent with hash:\", hash.hash);\n}\n","\nimport { ApiPromise } from \"@polkadot/api\";\nimport { testCrypt } from \"../crypto/core\";\nimport { encrypt, gen_stretched_key } from \"../crypto/cipher\";\nimport { hexToUint8Array, uint8ArrayToBase64 } from \"../utils\";\nimport type { Hex } from \"viem\";\nimport { signAndSend } from \"./utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { GuardianGroupInfo } from \"../da/types\";\n\ntype OnChainFileOptions = {\n\tfile: File;\n\tfilePath: string,\n\tfileName: string;\n\tdescription: string;\n\tbaseCost: bigint;\n\townerL2Address: string;\n\tguardianInfo: GuardianGroupInfo;\n}\n\ntype ChunkRef = { blockNumber: number; extrinsicIndex: number };\n\ntype FileMetadata = {\n\tname: string;\n\tdescription: string;\n\tstartRef: [number, number];\n};\n\nconst getBlock = async (api: ApiPromise, blockNumber: number) => {\n\tconst blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n\treturn await api.rpc.chain.getBlock(blockHash);\n};\nconst getFileMetadataCall = async (api: ApiPromise, metadataRef: [number, number]) => {\n\tconst block = await getBlock(api, metadataRef[0]);\n\tconst call = block.block.extrinsics[metadataRef[1]];\n\treturn call.method;\n};\n\nconst getFileMetadata = async (api: ApiPromise, metadataRef: [number, number]): Promise<FileMetadata> => {\n\tconst call = await getFileMetadataCall(api, metadataRef);\n\n\t// @ts-expect-error\n\tconst name = new TextDecoder().decode(call.args[0]);\n\t// @ts-expect-error\n\tconst description = new TextDecoder().decode(call.args[1]);\n\t// @ts-expect-error\n\tconst startRef = [call.args[2][0].toNumber(), call.args[2][1].toNumber()] as [number, number];\n\n\treturn {\n\t\tname,\n\t\tdescription,\n\t\tstartRef,\n\t};\n};\n\nasync function getFileSHA256(file: File): Promise<string> {\n\tconst buffer = new Array(12).fill(8);\n\t// const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n\tconst hashArray = Array.from(new Uint8Array(buffer));\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n\treturn hashHex;\n\n}\n\nconst readDataFromChain = async (api: ApiPromise, dataRef: [number, number]) => {\n\tconst call = await getFileMetadataCall(api, dataRef);\n\treturn call.args[0].toU8a();\n};\n\nclass MCryptFs {\n\t_api;\n\t_init;\n\t_metaRef: [number, number] | null;\n\t_metadata: FileMetadata | null;\n\t_chunkRefs: ChunkRef[];\n\n\tconstructor(mcryptApi: any, metadataRef: [number, number] | null, metadata: FileMetadata | null) {\n\t\tthis._api = mcryptApi;\n\t\tthis._metaRef = metadataRef;\n\t\tthis._metadata = metadata;\n\t\tthis._init = true;\n\t\tthis._chunkRefs = [];\n\t}\n\n\tstatic dummyInstance(mcryptApi: any) {\n\t\treturn new MCryptFs(mcryptApi, null, null);\n\t}\n\n\tisValid() {\n\t\tif (!this._metaRef) {\n\t\t\tthrow new Error(\"Metadata reference not set\");\n\t\t}\n\n\t\tif (\n\t\t\t!this._metadata ||\n\t\t\t!this._metadata.name ||\n\t\t\t!this._metadata.description ||\n\t\t\t!this._metadata.startRef\n\t\t) {\n\t\t\tthrow new Error(\"Metadata not set properly\");\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\tthis.isValid();\n\t\treturn this._metadata;\n\t}\n}\n\nclass MCryptFsWriter {\n\t_file;\n\t_filePath;\n\t_description;\n\t_chunkSize;\n\t_fileKey: string;\n\t_fileName: string;\n\t_baseCost;\n\t_ownerL2Address;\n\t_guardianInfo: GuardianGroupInfo;\n\t_api;\n\t_account: KeyringPair;\n\t_chunkRefs: ChunkRef[];\n\t_blockNumber;\n\t_extrinsicIndex;\n\t_progress;\n\t_error: Error | null;\n\n\tconstructor(fileOptions: OnChainFileOptions, chunkSize = 500, mcryptApi: any, account: KeyringPair) {\n\t\tconst {\n\t\t\tfile: iFile,\n\t\t\tfilePath,\n\t\t\tfileName,\n\t\t\tdescription,\n\t\t\tbaseCost,\n\t\t\townerL2Address,\n\t\t\tguardianInfo,\n\t\t} = fileOptions;\n\n\t\tthis._file = iFile;\n\t\tthis._filePath = filePath;\n\t\tthis._description = description;\n\t\tthis._fileName = fileName;\n\t\tthis._baseCost = baseCost;\n\t\tthis._fileKey = \"\";\n\t\tthis._ownerL2Address = ownerL2Address;\n\t\tthis._guardianInfo = guardianInfo;\n\t\tthis._chunkSize = chunkSize * 1024;\n\t\tthis._api = mcryptApi;\n\t\tthis._account = account;\n\n\t\tthis._chunkRefs = [];\n\t\tthis._blockNumber = 0;\n\t\tthis._extrinsicIndex = 0;\n\n\t\tthis._progress = {\n\t\t\tiFileSize: iFile.size,\n\t\t\tiBlocksWritten: 0,\n\t\t};\n\n\t\tthis._error = null;\n\t}\n\n\tprependMetadata(chunk: Blob) {\n\t\tconst blockNumberBuffer = new ArrayBuffer(4);\n\t\tconst blockView = new DataView(blockNumberBuffer);\n\t\tblockView.setUint32(0, this._blockNumber, false);\n\n\t\tconst extIndexBuffer = new ArrayBuffer(4);\n\t\tconst extView = new DataView(extIndexBuffer);\n\t\textView.setUint32(0, this._extrinsicIndex, false);\n\n\t\treturn new Blob([blockNumberBuffer, extIndexBuffer, chunk]);\n\t}\n\n\tasync writeChunk(chunk: Blob): Promise<{ blockNumber: number; index: number }> {\n\t\tconst request = this._api.tx.dataAvailability.submitData(\n\t\t\tArray.from(new Uint8Array(await chunk.arrayBuffer()))\n\t\t);\n\t\tconsole.log(\"account: \", this._account);\n\t\treturn new Promise<{ blockNumber: number; index: number }>((resolve) => {\n\t\t\trequest.signAndSend(this._account, { app_id: 1, currencyId: null }, (result: { isInBlock: boolean; isFinalized: boolean; isError: boolean; blockNumber?: { toNumber(): number }; txIndex?: number }) => {\n\t\t\t\tif (result.isInBlock || result.isFinalized || result.isError) {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tblockNumber: result.blockNumber?.toNumber() ?? 0,\n\t\t\t\t\t\tindex: result.txIndex ?? 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitKey(account: KeyringPair, data: string) {\n\t\tconst { encoded: encryptedKey, ikm } = testCrypt(this._guardianInfo.tauParams, this._guardianInfo.aggKey);\n\n\t\tconst td_params = uint8ArrayToBase64(hexToUint8Array(encryptedKey as Hex));\n\t\tconst shared_key = gen_stretched_key(\n\t\t\thexToUint8Array(ikm as Hex),\n\t\t);\n\t\tconst { ciphertext, nonce } = encrypt(\n\t\t\tnew Uint8Array(Uint8Array.from(data)),\n\t\t\tshared_key\n\t\t);\n\t\tconst blobRef = this._chunkRefs[this._chunkRefs.length - 1];\n\n\t\tconst modelSubmit = JSON.stringify({\n\t\t\tnonce: uint8ArrayToBase64(Uint8Array.from(nonce)),\n\t\t\tciphertext: uint8ArrayToBase64(Uint8Array.from(ciphertext)),\n\t\t\ttd_params,\n\t\t\tgroup_pk: this._guardianInfo.groupPk,\n\t\t\ttau_params: this._guardianInfo.tauParams,\n\t\t\tchosen_guardians: this._guardianInfo.guardians,\n\t\t\tblobRef: [blobRef.blockNumber, blobRef.extrinsicIndex],\n\t\t});\n\n\t\tconst request = this._api.tx.dataAvailability.submitData(modelSubmit);\n\t\treturn await signAndSend(request, account);\n\t}\n\n\tasync writeMetadata() {\n\n\t\tconst encoder = new TextEncoder();\n\t\tconst fileName = this._fileName;\n\t\tconst datasetRef = await this.submitKey(this._account, this._fileKey);\n\t\tconst keyRef = [datasetRef.blockNumber, datasetRef.index];\n\t\tconst request = this._api.tx.dataAvailability.daccRegisterData(\n\t\t\tArray.from(new TextEncoder().encode(fileName)),\n\t\t\tArray.from(new TextEncoder().encode(this._description)),\n\t\t\tkeyRef,\n\t\t\tthis._baseCost,\n\t\t\t0,\n\t\t\tArray.from(encoder.encode(this._ownerL2Address)),\n\t\t\tthis._guardianInfo.groupId,\n\t\t);\n\n\t\treturn await signAndSend(request, this._account);\n\t}\n\n\tasync writeFile() {\n\t\tconst chunks = [];\n\t\tlet offset = 0;\n\n\t\twhile (offset < this._file.size) {\n\t\t\tconst chunk = this._file.slice(offset, offset + this._chunkSize);\n\t\t\tconst prependedChunk = this.prependMetadata(chunk);\n\t\t\tconst blockInfo = await this.writeChunk(prependedChunk);\n\n\t\t\tthis._blockNumber = blockInfo.blockNumber;\n\t\t\tthis._extrinsicIndex = blockInfo.index;\n\t\t\tthis._progress.iBlocksWritten += chunk.size;\n\t\t\tthis._chunkRefs.push({\n\t\t\t\tblockNumber: this._blockNumber,\n\t\t\t\textrinsicIndex: this._extrinsicIndex,\n\t\t\t});\n\n\t\t\toffset += this._chunkSize;\n\t\t}\n\n\t\tthis._fileKey = (await getFileSHA256(this._file)) as string;\n\t\tconst metadataRef = await this.writeMetadata();\n\t\treturn await FileFromMetadataRef(this._api, [\n\t\t\tmetadataRef.blockNumber,\n\t\t\tmetadataRef.index ?? 0,\n\t\t]);\n\t}\n}\n\nclass MCryptFsReader {\n\t_filename;\n\t_api;\n\t_onChainFile: MCryptFs;\n\n\tconstructor(filename: string, mcryptApi: any, onChainFile: MCryptFs) {\n\t\tthis._filename = filename;\n\t\tthis._api = mcryptApi;\n\t\tthis._onChainFile = onChainFile;\n\t}\n\n\tasync downloadFile() {\n\t\tconst chunks = [];\n\n\t\tif (!this._onChainFile._metadata) {\n\t\t\tthrow new Error(\"Metadata not loaded\");\n\t\t}\n\n\t\tlet _blockNumber = this._onChainFile._metadata.startRef[0];\n\t\tlet _extIndex = this._onChainFile._metadata.startRef[1];\n\n\t\twhile (_blockNumber !== 0) {\n\t\t\tconst prependedChunk = await readDataFromChain(this._api, [\n\t\t\t\t_blockNumber,\n\t\t\t\t_extIndex,\n\t\t\t]);\n\t\t\tconst chunk = prependedChunk.slice(12);\n\t\t\tchunks.push(chunk);\n\n\t\t\tconst view = new DataView(new Uint8Array(prependedChunk).buffer);\n\t\t\t_blockNumber = view.getUint32(4);\n\t\t\t_extIndex = view.getUint32(8);\n\t\t}\n\n\t\t// Combine all chunks into a single blob\n\t\tconst blob = new Blob(chunks.reverse());\n\n\t\t// Create download link\n\t\tconst url = URL.createObjectURL(blob);\n\t\tconst a = document.createElement(\"a\");\n\t\ta.href = url;\n\t\ta.download = this._filename;\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\tdocument.body.removeChild(a);\n\t\tURL.revokeObjectURL(url);\n\n\t\treturn blob;\n\t}\n}\n\nconst FileFromMetadataRef = async (mcryptApi: any, metadataRef: [number, number]) => {\n\tconst metadata = await getFileMetadata(mcryptApi, metadataRef);\n\treturn new MCryptFs(mcryptApi, metadataRef, metadata);\n};\n\nexport { MCryptFs, MCryptFsWriter, MCryptFsReader, FileFromMetadataRef };\n","import type { ApiPromise } from \"@polkadot/api\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getApi } from \"./singleton\";\n\nexport interface LatestBlock {\n height: number;\n hash: string;\n time: number;\n validator: string;\n eventsCount: number;\n extrinsicsCount: number;\n}\n\nexport interface LatestBlocksResult {\n blocks: LatestBlock[];\n latestHeight: number;\n}\n\n/**\n * Newest on-chain blocks first, paged backward from the current tip.\n * Uses RPC rather than the indexer `/api/blocks` list.\n */\nexport async function getLatestBlocks(\n count: number,\n page = 0,\n apiInstance?: ApiPromise,\n): Promise<LatestBlocksResult> {\n await waitReady();\n const api = apiInstance ?? (await getApi());\n if (!api) throw new Error(\"API not initialized\");\n\n const header = await api.rpc.chain.getHeader();\n const latestHeight = header.number.toNumber();\n const start = latestHeight - page * count;\n if (start < 0) {\n return { blocks: [], latestHeight };\n }\n\n const heights: number[] = [];\n for (let height = start; height >= Math.max(0, start - count + 1); height -= 1) {\n heights.push(height);\n }\n\n const blocks = await Promise.all(\n heights.map(async (height) => {\n const hash = await api.rpc.chain.getBlockHash(height);\n const [signed, derived, at] = await Promise.all([\n api.rpc.chain.getBlock(hash),\n api.derive.chain.getHeader(hash).catch(() => null),\n api.at(hash),\n ]);\n const [timestamp, events] = await Promise.all([\n at.query.timestamp.now(),\n at.query.system.events(),\n ]);\n\n return {\n height,\n hash: hash.toHex(),\n time: Number(timestamp.toString()),\n validator: derived?.author?.toString?.() ?? \"\",\n\t\t\t\textrinsicsCount: signed.block.extrinsics.length,\n\t\t\t\teventsCount: (events as unknown as { length: number }).length,\n };\n }),\n );\n\n return { blocks, latestHeight };\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { formatBalanceWithTokenProperties } from \"../utils/token\";\n\nexport interface Balance {\n free: bigint;\n reserved: bigint;\n frozen: bigint;\n /** Free balance formatted with the chain's token symbol/decimals, e.g. \"1.5 PALI\". */\n formatted: string;\n}\n\n/** Reads an account's free/reserved/frozen balance from `system.account`. */\nexport async function getBalance(address: string): Promise<Balance> {\n const api = await getApi();\n assert(api, \"API not initialized\");\n\n const account = (await api.query.system.account(address)).toPrimitive() as {\n data: { free: string | number; reserved: string | number; frozen: string | number };\n };\n\n const free = BigInt(account.data.free);\n const reserved = BigInt(account.data.reserved);\n const frozen = BigInt(account.data.frozen);\n\n return {\n free,\n reserved,\n frozen,\n formatted: await formatBalanceWithTokenProperties(free),\n };\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { getBalance, type Balance } from \"../token/balance\";\n\nexport interface AccountInfo {\n address: string;\n nonce: number;\n balance: Balance;\n /** On-chain identity display name, or `null` if none is set. */\n displayName: string | null;\n}\n\nfunction extractDisplayName(display: unknown): string | null {\n if (!display || display === \"None\") return null;\n if (typeof display === \"string\") return display;\n if (typeof display === \"object\" && \"Raw\" in (display as Record<string, unknown>)) {\n return String((display as { Raw: unknown }).Raw);\n }\n return null;\n}\n\n/** Convenience read combining balance, nonce, and identity display name for a single account. */\nexport async function getAccountInfo(address: string): Promise<AccountInfo> {\n const api = await getApi();\n assert(api, \"API not initialized\");\n\n const [accountData, balance, identity] = await Promise.all([\n api.query.system.account(address),\n getBalance(address),\n api.query.identity.identityOf(address),\n ]);\n\n const nonce = (accountData.toPrimitive() as { nonce: number }).nonce;\n const identityHuman = identity.toHuman() as { info?: { display?: unknown } } | null;\n\n return {\n address,\n nonce,\n balance,\n displayName: extractDisplayName(identityHuman?.info?.display),\n };\n}\n","import { findEvent, getApi, getGuardianAddress, getKeyring, signAndSend, type API_TYPES } from \"../chain\";\nimport { assert, debugLog, toAtomicPaliAmount } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { GuardianAddress } from \"../da/types\";\nimport type { CurrencyId, Fee } from \"../chain/types\";\n\n/**\n * Converts a {@link Fee} into the on-chain `fees` / `computeRate` pair.\n * `computeRate` only has meaning for `Active` contracts (it drives dynamic\n * fee calculation during `compute.result`); omit `computeRate` for `Dormant`\n * contracts.\n */\nexport function buildFee(fee?: Fee) {\n return {\n fees: toAtomicPaliAmount(fee?.amount ?? \"0\"),\n computeRate: toAtomicPaliAmount(fee?.computeRate ?? \"0\"),\n };\n}\n\n/** Zero `H256` — the `groupId` of a contract that belongs to no guardian group. */\nexport const NO_GUARDIAN_GROUP = `0x${\"00\".repeat(32)}`;\n\n/**\n * Classification carried in `ComputeMetadata.storeType`.\n *\n * Mirrors `pallet_compute::StoreType` variant-for-variant via {@link API_TYPES}.\n * Order is the encoding: the variant index is what goes on the wire, so an\n * omitted or reordered variant silently shifts every one after it.\n */\nexport type StoreType = keyof typeof API_TYPES.StoreType._enum;\n\nexport interface ComputeMetadataInput {\n /** Human-readable name of the registered artifact. */\n name: string;\n /** Human-readable description of the registered artifact. */\n description: string;\n /** What kind of artifact this is. */\n storeType: StoreType;\n /**\n * H256 of the guardian group this entry belongs to. Defaults to\n * {@link NO_GUARDIAN_GROUP} — correct for plaintext contracts, which have no\n * group. The chain stores this field but never reads it.\n */\n groupId?: string;\n}\n\n/**\n * Converts a {@link ComputeMetadataInput} into the on-chain `ComputeMetadata`,\n * whose `name` and `description` are byte vectors rather than strings.\n * Returns `null` for absent metadata, which is what `Option<ComputeMetadata>`\n * expects.\n */\nexport function buildComputeMetadata(metadata?: ComputeMetadataInput) {\n if (!metadata) return null;\n\n const encoder = new TextEncoder();\n return {\n name: Array.from(encoder.encode(metadata.name)),\n description: Array.from(encoder.encode(metadata.description)),\n storeType: metadata.storeType,\n groupId: metadata.groupId ?? NO_GUARDIAN_GROUP,\n };\n}\n\nexport interface ComputeContract {\n contractType: \"Active\" | \"Dormant\";\n guardians: GuardianAddress[];\n preCheck?: unknown;\n compute: Record<string, unknown>;\n postCheck?: unknown;\n resultCipher: unknown;\n /** Currency the deposit is reserved in and settlement is paid out in. Defaults to \"Native\". */\n currencyId?: CurrencyId;\n}\n\nexport async function createAgreement(\n contract: ComputeContract,\n account: KeyringPair,\n oracle_quore_id: string | undefined = undefined,\n): Promise<{\n blockNumber: number;\n index: number;\n hash: string;\n agreementId?: string;\n}> {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n // currencyId defaults to \"Native\", reproducing pre-upgrade behavior for callers\n // that don't opt into paying the contract deposit/settlement in another currency.\n const onChainContract = { currencyId: \"Native\" as const, ...contract };\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"compute\"][\"agreement\"](onChainContract, oracle_quore_id ?? null);\n const opts = {\n compute: {\n daType: 1,\n verification: 0,\n compute: contract.contractType === \"Active\" ? 1 : 0,\n },\n };\n\n const { tx_result, blockNumber, index, hash } = await signAndSend(\n tx,\n account,\n opts,\n );\n\n if (!tx_result.isError) {\n const agreementCreatedEvent = findEvent(tx_result.events, \"compute\", \"AgreementCreated\");\n\n if (agreementCreatedEvent) {\n debugLog(\"Agreement data:\", agreementCreatedEvent.event.data.toString());\n return {\n blockNumber,\n index: index ?? 0,\n hash,\n agreementId:\n agreementCreatedEvent.event.data[0]?.toHex?.() ??\n agreementCreatedEvent.event.data.toString(),\n };\n } else {\n debugLog(\"AgreementCreated event not found\");\n }\n }\n\n return { blockNumber, index: index ?? 0, hash };\n}\n\nexport interface InvokeAgreementInput {\n /** Guardian account IDs handling the invocation; matches the agreement's guardian set. */\n guardians: GuardianAddress[];\n /** Cipher suite describing how `data` is encrypted. Use \"Plaintext\" for unencrypted payloads. */\n cipher: unknown;\n /** Invocation payload bytes (already encrypted if `cipher` is not \"Plaintext\"). */\n data: Uint8Array | number[];\n}\n\n/**\n * Invokes an existing `Subscription`-type agreement with a new payload, via\n * `compute.invoke`.\n *\n * @param agreementId - Hex-encoded agreement ID (as returned by `createAgreement`).\n */\nexport async function invokeAgreement(\n agreementId: string,\n input: InvokeAgreementInput,\n account: KeyringPair,\n opts?: Record<string, unknown>,\n) {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"compute\"][\"invoke\"](\n agreementId,\n input.guardians,\n input.cipher,\n { Inline: { data: Array.from(input.data) } },\n );\n\n return signAndSend(tx, account, opts);\n}\n\nexport async function createSimpleAgreement() {\n const guardianIds = (await getGuardianAddress())\n .slice(0, 3)\n .map((g) => g.address);\n assert(guardianIds.length === 3, \"Not enough guardians to create agreement\");\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: guardianIds,\n preCheck: null,\n compute: {\n cipher: \"Plaintext\",\n computerIndices: [0, 1, 2],\n ...buildFee({ amount: \"0\", computeRate: \"0\" }),\n deadline: 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: null,\n program: { NativeData: \"DaFalse\" },\n metadata: null,\n },\n postCheck: null,\n resultCipher: \"Plaintext\",\n };\n\n const keyring = await getKeyring();\n const account = keyring.getPairs()[0];\n\n return createAgreement(contract, account);\n}\n\nexport default createSimpleAgreement;\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { ComputeMetadataInput } from \"./agreement\";\n\nexport interface DataContractParams {\n /** URL pointing to the data to store. Mutually exclusive with `data`. */\n url?: string;\n /**\n * Bytes carried in the extrinsic itself, for payloads small enough not to\n * warrant off-chain hosting. Mutually exclusive with `url`.\n */\n data?: string | Uint8Array;\n /** Guardian account IDs that participate in this contract. */\n guardians: string[];\n /**\n * Absolute fee offered for the contract. Defaults to 0.\n * `computeRate` is omitted: this is a `Dormant` contract and the\n * compute rate only applies to `Active` contracts.\n */\n fee: Fee;\n /**\n * Describes the registered artifact — name, description, and the `storeType`\n * saying what kind of thing it is. Omitted metadata registers the contract\n * anonymously, which leaves nothing on-chain to tell a stored dataset from a\n * stored program.\n */\n metadata?: ComputeMetadataInput;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits a dormant data-store contract on-chain via `compute.agreement`.\n *\n * - No encryption (Plaintext cipher suite)\n * - Trusted confidentiality mode\n * - Input fetched from a URL, or carried inline in the extrinsic\n * - No pre-check or post-check verifications\n * - Plain (unencrypted) result\n *\n * The artifact goes in `compute.input` and `compute.program` stays inert: a\n * `Dormant` contract registers something rather than running it. A later\n * `Active` contract reaches this artifact with `{ ContractId: { id } }`, in\n * either its own `input` or its `program`, and pays this contract's owner the\n * `fee` offered here as the usage price.\n */\nexport async function dataContract(params: DataContractParams, account: KeyringPair) {\n const plaintextCipher = \"Plaintext\";\n assert(\n (params.url === undefined) !== (params.data === undefined),\n \"dataContract requires exactly one of `url` or `data`\",\n );\n\n const input =\n params.url !== undefined\n ? { Url: { url: Array.from(new TextEncoder().encode(params.url)) } }\n : {\n Inline: {\n data: Array.from(\n typeof params.data === \"string\"\n ? new TextEncoder().encode(params.data)\n : (params.data as Uint8Array),\n ),\n },\n };\n\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input,\n program: {\n NativeData: \"DaFalse\",\n },\n metadata: buildComputeMetadata(params.metadata),\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { toAtomicPaliAmount } from \"../utils/token\";\nimport type { PaliAmountInput } from \"../utils/token\";\n\n/**\n * The chain-side parameters the compute fee floor is derived from.\n *\n * All four are read live: the first three are root-settable storage values\n * (`compute.setMaxDaStorageSize`, `setProviderStorageRate`,\n * `setThresholdDecryptionFee`), so a hard-coded copy goes stale silently and\n * surfaces only as an `InsufficientFreeBalance` at submission time.\n */\nexport interface FeeParams {\n /** Bytes of DA storage a result is priced against. */\n maxDaStorageSize: bigint;\n /** Price per byte of DA storage, in atomic units. */\n providerStorageRate: bigint;\n /** Flat fee split between the contract's guardians, in atomic units. */\n thresholdDecryptionFee: bigint;\n /** Block time in milliseconds, the multiplier applied to `computeRate`. */\n millisecondsPerBlock: bigint;\n}\n\nexport interface MinFeeInput {\n /** Per-millisecond compute rate the contract offers, in PALI. */\n computeRate: PaliAmountInput;\n /** Contract ID supplying the input, whose owner is owed the input fee. */\n inputContractId?: string;\n}\n\n/** The fee floor and the four components it is built from, all in atomic units. */\nexport interface MinFeeBreakdown {\n /** `maxDaStorageSize * providerStorageRate` — pays whoever submits the result. */\n resultFee: bigint;\n /** `usagePrice` of the referenced input contract, or 0 when none is referenced. */\n inputFee: bigint;\n /** Flat threshold-decryption fee, split between the contract's guardians. */\n thresholdDecryptionFee: bigint;\n /** `computeRate * millisecondsPerBlock` — one block's worth of compute. */\n offeredComponent: bigint;\n /** The sum: the smallest `fees` the chain accepts for this contract. */\n minFee: bigint;\n}\n\n/**\n * `MillisecondsPerBlock` is a plain `Get<u64>` on `pallet_compute::Config`, not a\n * `#[pallet::constant]`, so it is absent from metadata and cannot be read as\n * `api.consts.compute.millisecondsPerBlock`. The runtime wires both it and\n * `Babe::ExpectedBlockTime` to the same `MILLISECS_PER_BLOCK` constant, so Babe's\n * copy is read instead, falling back to twice the timestamp minimum period.\n */\nasync function readMillisecondsPerBlock(): Promise<bigint> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n\n const expectedBlockTime = api.consts.babe?.expectedBlockTime;\n if (expectedBlockTime) {\n return BigInt(expectedBlockTime.toString());\n }\n\n const minimumPeriod = api.consts.timestamp?.minimumPeriod;\n assert(minimumPeriod, \"Cannot determine block time: neither babe.expectedBlockTime nor timestamp.minimumPeriod exists\");\n\n return BigInt(minimumPeriod.toString()) * 2n;\n}\n\n/**\n * Reads the four live chain parameters that define the compute fee floor.\n *\n * Throws when the connected runtime predates the metered-compute upgrade: older\n * runtimes expose a `compute` pallet with neither these storage items nor the\n * `Contract`-shaped `agreement` call, so there is no fee floor to report.\n */\nexport async function getFeeParams(): Promise<FeeParams> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n assert(\n api.query.compute?.maxDaStorageSize,\n \"compute.maxDaStorageSize does not exist on this runtime: the connected chain predates \" +\n \"metered compute, and has no fee floor. Check PALLIORA_WS points at a current node.\",\n );\n\n const [maxDaStorageSize, providerStorageRate, thresholdDecryptionFee, millisecondsPerBlock] =\n await Promise.all([\n api.query.compute.maxDaStorageSize(),\n api.query.compute.providerStorageRate(),\n api.query.compute.thresholdDecryptionFee(),\n readMillisecondsPerBlock(),\n ]);\n\n return {\n maxDaStorageSize: BigInt(maxDaStorageSize.toString()),\n providerStorageRate: BigInt(providerStorageRate.toString()),\n thresholdDecryptionFee: BigInt(thresholdDecryptionFee.toString()),\n millisecondsPerBlock,\n };\n}\n\n/**\n * Computes the smallest `fees` an `Active` or `Subscription` contract may offer.\n *\n * Mirrors `pallet_compute::Pallet::fee_components`, which `CheckCompute` enforces\n * when validating the extrinsic and which `compute.result` settles against. An\n * offer below this floor is rejected as `InsufficientFreeBalance` before the\n * agreement is ever included in a block.\n *\n * Clearing this floor is necessary but not sufficient: guardians independently\n * reject an agreement whose `computeRate` is under their own per-compute-type\n * threshold. See CHAIN-RULES.md (\"Two gates, not one\").\n *\n * `Dormant` contracts reserve nothing and are exempt — they may offer any `fees`,\n * including zero.\n */\nexport async function estimateMinFee(input: MinFeeInput): Promise<MinFeeBreakdown> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n\n const params = await getFeeParams();\n\n const resultFee = params.maxDaStorageSize * params.providerStorageRate;\n\n let inputFee = 0n;\n if (input.inputContractId) {\n const contract = (await api.query.compute.contracts(input.inputContractId)).toJSON() as Record<\n string,\n unknown\n > | null;\n if (contract) {\n inputFee = BigInt(String(contract[\"usagePrice\"] ?? contract[\"usage_price\"] ?? 0));\n }\n }\n\n const offeredComponent = toAtomicPaliAmount(input.computeRate) * params.millisecondsPerBlock;\n\n return {\n resultFee,\n inputFee,\n thresholdDecryptionFee: params.thresholdDecryptionFee,\n offeredComponent,\n minFee: resultFee + inputFee + params.thresholdDecryptionFee + offeredComponent,\n };\n}\n","import { edwardsToMontgomeryPub } from \"@noble/curves/ed25519\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport { getApi, signAndSend } from \"../chain\";\nimport { encrypt, gen_stretched_key, testCrypt } from \"../crypto\";\nimport { hexToUint8Array, Hex } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { GuardianGroupInfo } from \"../da/types\";\n\nexport interface EncryptedInferenceSubscriptionParams {\n /** Guardian account addresses that participate in this compute. */\n guardians: string[];\n /** Fee offered for the compute step. Defaults to 0. */\n fee?: Fee;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\nexport interface EncryptedInferenceSubscriptionInvocationParams {\n /** Hex-encoded agreement ID returned by encryptedInferenceSubscription. */\n agreementId: string;\n /** Input payload to encrypt and submit. String is UTF-8 encoded. */\n input: Uint8Array | string;\n /** Guardian addresses to route the compute request to. */\n guardians: string[];\n /** Guardian group cryptographic parameters for threshold encryption. */\n guardianInfo: GuardianGroupInfo;\n}\n\nexport interface EncryptedInferenceComputeParams {\n /** Input payload to encrypt and submit. String is UTF-8 encoded. */\n input: Uint8Array | string;\n /** Guardian account addresses that participate in this compute. */\n guardians: string[];\n /** Guardian group cryptographic parameters for threshold encryption. */\n guardianInfo: GuardianGroupInfo;\n /** Fee offered for the compute step. Defaults to 0. */\n fee?: Fee;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\n/**\n * Creates a Dormant agreement that registers encrypted inference compute terms.\n * The agreement ID returned here is passed to encryptedInferenceSubscriptionInvocation\n * for each subsequent encrypted inference call.\n */\nexport async function encryptedInferenceSubscription(\n params: EncryptedInferenceSubscriptionParams,\n account: KeyringPair,\n) {\n const computeStep = {\n cipher: \"Plaintext\",\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: null,\n program: { NativeExecute: \"Inference\" },\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: \"Plaintext\",\n };\n\n return createAgreement(contract, account);\n}\n\n/**\n * Invokes an existing encrypted inference subscription agreement with a\n * threshold-encrypted input payload. The result is encrypted back to encAccount.\n *\n * @param params - Agreement ID, input payload, guardians, and guardian group crypto params.\n * @param encAccount - Ed25519 keypair whose public key is used to receive the encrypted result.\n * @param account - Keypair used to sign and submit the transaction.\n */\nexport async function encryptedInferenceSubscriptionInvocation(\n params: EncryptedInferenceSubscriptionInvocationParams,\n encAccount: KeyringPair,\n account: KeyringPair,\n) {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n const inputBytes =\n typeof params.input === \"string\"\n ? new TextEncoder().encode(params.input)\n : params.input;\n\n const { encoded: cyphtxt, ikm } = testCrypt(\n params.guardianInfo.tauParams,\n params.guardianInfo.aggKey,\n );\n\n const sharedKey = gen_stretched_key(hexToUint8Array(ikm as Hex));\n const { ciphertext, nonce } = encrypt(inputBytes, sharedKey);\n\n const cyphtxtBytes = hexToUint8Array(cyphtxt as Hex);\n const groupPkBytes = hexToUint8Array(params.guardianInfo.groupPk as Hex);\n const tauParamsBytes = hexToUint8Array(params.guardianInfo.tauParams as Hex);\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"dataAvailability\"][\"daccComputeRequest\"](\n edwardsToMontgomeryPub(encAccount.publicKey),\n nonce,\n Array.from(ciphertext),\n params.guardians[0],\n Array.from(cyphtxtBytes),\n Array.from(groupPkBytes),\n Array.from(tauParamsBytes),\n params.guardians,\n );\n\n const idHex = params.agreementId.startsWith(\"0x\")\n ? params.agreementId.slice(2)\n : params.agreementId;\n\n const opts = {\n compute: {\n da_type: 4,\n agreement: [Buffer.from(idHex, \"hex\")],\n verification: 0,\n compute: 1,\n },\n };\n\n return signAndSend(tx, account, opts);\n}\n\n/**\n * Convenience wrapper: creates an encrypted inference subscription then\n * immediately invokes it with the given input. Returns both receipts.\n *\n * @param params - Input payload, guardians, guardian group crypto params, and fee.\n * @param encAccount - Ed25519 keypair whose public key is used to receive the encrypted result.\n * @param account - Keypair used to sign and submit both transactions.\n */\nexport async function encryptedInferenceCompute(\n params: EncryptedInferenceComputeParams,\n encAccount: KeyringPair,\n account: KeyringPair,\n) {\n const subscription = await encryptedInferenceSubscription(\n {\n guardians: params.guardians,\n fee: params.fee,\n deadline: params.deadline,\n },\n account,\n );\n\n if (!subscription.agreementId) {\n throw new Error(\"Subscription creation did not return an agreement ID\");\n }\n\n const invocation = await encryptedInferenceSubscriptionInvocation(\n {\n agreementId: subscription.agreementId,\n input: params.input,\n guardians: params.guardians,\n guardianInfo: params.guardianInfo,\n },\n encAccount,\n account,\n );\n\n return { subscription, invocation };\n}\n","/**\n * Generates random bytes of the specified length.\n * Uses Web Crypto API (crypto.getRandomValues) - available in all modern browsers\n * and Node.js 18+.\n *\n * @param length Number of bytes.\n * @returns Uint8Array containing random bytes.\n */\nexport function generateRandomBytes(length: number = 32): Uint8Array {\n const bytes = new Uint8Array(length);\n const cr = globalThis.crypto;\n if (!cr || typeof cr.getRandomValues !== \"function\") {\n throw new Error(\n \"crypto.getRandomValues is not available. Ensure you're running in a supported environment (browser or Node.js 18+).\"\n );\n }\n cr.getRandomValues(bytes);\n return bytes;\n}\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport type { Fee } from \"../chain/types\";\n\nexport interface InferenceComputeParams {\n /** Raw input data — string will be UTF-8 encoded, Uint8Array used as-is. */\n input: Uint8Array | string;\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Fee offered for the compute step. Defaults to 0 amount and 0 compute rate. */\n fee: Fee;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\n/**\n * Submits a plain (unencrypted, no-confidentiality) inference compute request\n * on-chain via the `compute.agreement` extrinsic.\n *\n * - Input is sent inline (no DA layer indirection).\n * - Program is the native `Inference` executor.\n * - Pre-check and post-check are no-ops (no verification).\n * - Cipher fields carry zero-value placeholders (unused in the trusted path).\n * - Result is returned in plain (no re-encryption).\n */\nexport async function inferenceCompute(params: InferenceComputeParams, account: KeyringPair) {\n const inputData =\n typeof params.input === \"string\"\n ? Array.from(new TextEncoder().encode(params.input))\n : Array.from(params.input);\n\n // No encryption — use the Plaintext variant of CipherSuite.\n const plaintextCipher = \"Plaintext\";\n\n // Primary compute step: inline input + native inference execution.\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: { Inline: { data: inputData } },\n program: { NativeExecute: \"Inference\" },\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n compute: computeStep,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import bs58 from 'bs58';\nimport { disconnectApi, getApi } from '../chain';\n\nexport interface GuardianParticipants {\n\tnwState: {\n\t\tlocalPeerId: string | undefined;\n\t\tworker: unknown;\n\t\tcurrentEra: unknown;\n\t\tguardians: string | null;\n\t\tnextGuardians: string | null;\n\t\tcurrentIndex: unknown;\n\t\tnextIndex: number;\n\t};\n\tcurrentGuardians: unknown[];\n\tupcomingGuardians: unknown[];\n}\n\nexport async function getGuardianParticipants(): Promise<GuardianParticipants> {\n\tconst api = await getApi();\n\tif (!api) throw new Error('Api not initialized');\n\n\ttry {\n\t\tconst guardians = await api.query.guardian.guardians();\n\t\tconst nextGuardians = await api.query.guardian.nextGuardians();\n\t\tconst currentEra = await api.query.staking.currentEra();\n\t\tconst currentIndex = await api.query.guardian.currentIndex();\n\t\tconst peerid = await api.rpc.system.localPeerId();\n\t\tconst _peerid = bs58.decode((peerid || '').toString());\n\t\tconst account = await api.query.guardian.workerByKey(_peerid.slice(6, 38));\n\t\tconst nextIndex = currentIndex ? Number(currentIndex) + 1 : 1;\n\n\t\tconst guardiansList = (guardians?.toJSON() || []) as string[];\n\t\tconst nextGuardiansList = (nextGuardians?.toJSON() || []) as string[];\n\n\t\tconst buildDetails = async (list: string[]) => {\n\t\t\treturn Promise.all(\n\t\t\t\tlist.map(async (guardian: string) => {\n\t\t\t\t\tconst guardianPrefs = await api.query.staking.guardians(guardian);\n\t\t\t\t\tconst ledger = await api.query.staking.ledger(guardian);\n\t\t\t\t\tconst bonded = await api.query.staking.bonded(guardian);\n\t\t\t\t\tconst payee = await api.query.staking.payee(guardian);\n\t\t\t\t\tconst stakersOverview = await api.query.staking.erasStakersOverview(\n\t\t\t\t\t\tcurrentEra?.toPrimitive(),\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t);\n\t\t\t\t\tconst guardianErasPrefs = await api.query.staking.erasGuardianPrefs(\n\t\t\t\t\t\tcurrentEra?.toPrimitive(),\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t\trewardDestination: payee?.toHuman ? payee.toHuman() : null,\n\t\t\t\t\t\tcurrentPreferences: (guardianErasPrefs?.toHuman ? guardianErasPrefs.toHuman() : null),\n\t\t\t\t\t\tupcomingPreferences: (guardianPrefs?.toHuman ? guardianPrefs.toHuman() : null),\n\t\t\t\t\t\tstash: bonded?.toHuman ? bonded.toHuman() : null,\n\t\t\t\t\t\tcurrentStakeOverview: stakersOverview?.toHuman ? stakersOverview.toHuman() : null,\n\t\t\t\t\t\tupcomingStakeOverview: ledger?.toHuman ? ledger.toHuman() : null,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\t\t};\n\n\t\tconst currentGuardians = await buildDetails(guardiansList);\n\t\tconst upcomingGuardians = await buildDetails(nextGuardiansList);\n\n\t\treturn {\n nwState: {\n localPeerId: peerid?.toString(),\n worker: account?.toHuman ? account.toHuman() : null,\n currentEra: currentEra?.toHuman ? currentEra.toHuman() : null,\n guardians: JSON.stringify(guardians?.toHuman ? guardians.toHuman() : null, null, 2),\n nextGuardians: JSON.stringify(nextGuardians?.toHuman ? nextGuardians.toHuman() : null, null, 2),\n currentIndex: currentIndex?.toHuman ? currentIndex.toHuman() : null,\n nextIndex,\n },\n\t\t\tcurrentGuardians,\n\t\t\tupcomingGuardians,\n\t\t};\n\t} finally {\n\t\tawait disconnectApi();\n\t}\n}\n\nexport default getGuardianParticipants;\n\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport type { Fee } from \"../chain/types\";\n\nexport interface SimpleComputeParams {\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Input reference block number from which to read the tx payload. */\n inputBlockNumber?: number;\n /** Input reference extrinsic index within the input block. */\n inputExtrinsicIndex?: number;\n /** Program location as URL. */\n programUrl: string;\n /** Fee offered for the compute step. Defaults to 0 amount and 0 compute rate. */\n fee?: Fee;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits a minimal trusted compute agreement:\n * - no encryption (plaintext cipher)\n * - trusted confidentiality mode\n * - input from chain transaction reference\n * - program fetched from URL\n * - no pre/post verification\n */\nexport async function simpleCompute(params: SimpleComputeParams, account: KeyringPair) {\n const plaintextCipher = \"Plaintext\";\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: null,\n program: {\n Url: {\n url: Array.from(new TextEncoder().encode(params.programUrl)),\n },\n },\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { ComputeMetadataInput } from \"./agreement\";\n\nexport interface StoredComputeParams {\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Contract ID of the `Dormant` contract registering the program. */\n programContractId: string;\n /** Contract ID of the `Dormant` contract registering the input data. */\n inputContractId: string;\n /**\n * Fee offered for the compute step. Must clear the floor returned by\n * `estimateMinFee({ computeRate, inputContractId })` — referencing a stored\n * input raises that floor by the input contract's usage price.\n */\n fee: Fee;\n /** Describes this execution. Unlike the contracts it references, it registers\n * nothing — so `storeType` is `\"Other\"` unless the run itself produces a\n * classifiable artifact. */\n metadata?: ComputeMetadataInput;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits an `Active` agreement whose program and input both live in contracts\n * already registered on-chain.\n *\n * Where {@link simpleCompute} carries the program as a URL and the input as a\n * block coordinate, this points at two `Dormant` contracts instead. Each\n * `{ ContractId: { id } }` resolves to that contract's `compute.input` — the\n * field {@link dataContract} stores an artifact in — so the program contract\n * supplies the image and the input contract supplies the data.\n *\n * Only the `input` reference is billed: settlement pays the input contract's\n * owner its `usage_price`, which is why that ID is also what\n * `estimateMinFee` needs to quote the floor.\n */\nexport async function storedCompute(params: StoredComputeParams, account: KeyringPair) {\n assert(!!params.programContractId, \"storedCompute requires a programContractId\");\n assert(!!params.inputContractId, \"storedCompute requires an inputContractId\");\n\n const plaintextCipher = \"Plaintext\";\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: { ContractId: { id: params.inputContractId } },\n program: { ContractId: { id: params.programContractId } },\n metadata: buildComputeMetadata(params.metadata),\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getCostEstimatorUrl } from \"../config\";\nimport { debugLog } from \"../utils\";\n\n/** Thrown for any non-2xx response from the cost estimation service. */\nexport class CostEstimationError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"CostEstimationError\";\n }\n}\n\nasync function request<T>(\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n): Promise<T> {\n const url = `${getCostEstimatorUrl()}${path}`;\n debugLog(`cost estimation service: ${method} ${url}`, body);\n\n const res = await fetch(url, {\n method,\n headers: body !== undefined ? { \"Content-Type\": \"application/json\" } : undefined,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n const text = await res.text();\n const data = text ? JSON.parse(text) : undefined;\n\n if (!res.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String((data as { error: unknown }).error)\n : `cost estimation service returned ${res.status}`;\n throw new CostEstimationError(message, res.status);\n }\n\n return data as T;\n}\n\nexport const costEstimationClient = {\n get: <T>(path: string) => request<T>(\"GET\", path),\n post: <T>(path: string, body?: unknown) => request<T>(\"POST\", path, body),\n};\n","import { costEstimationClient } from \"./client\";\nimport type {\n ContractParams,\n EstimateResult,\n EstimateStatusResponse,\n GuardianEntry,\n} from \"./types\";\n\ninterface RawGuardianEntry {\n address: string;\n pubKey: string;\n feeThreshold: string;\n}\n\ninterface RawEstimateResult {\n predictedDurationMs: number;\n auctionedRate: string;\n estimatedCost: string;\n guardians: RawGuardianEntry[];\n}\n\ntype RawEstimateStatusResponse =\n | { status: \"pending\"; auctionId: string }\n | { status: \"completed\"; auctionId: string; result: RawEstimateResult }\n | { status: \"failed\"; auctionId: string; error: string };\n\nfunction toGuardianEntry(raw: RawGuardianEntry): GuardianEntry {\n return {\n address: raw.address,\n pubKey: raw.pubKey,\n feeThreshold: BigInt(raw.feeThreshold),\n };\n}\n\nfunction toEstimateResult(raw: RawEstimateResult): EstimateResult {\n return {\n predictedDurationMs: raw.predictedDurationMs,\n auctionedRate: BigInt(raw.auctionedRate),\n estimatedCost: BigInt(raw.estimatedCost),\n guardians: raw.guardians.map(toGuardianEntry),\n };\n}\n\nfunction toEstimateStatusResponse(\n raw: RawEstimateStatusResponse,\n): EstimateStatusResponse {\n if (raw.status === \"completed\") {\n return { status: \"completed\", auctionId: raw.auctionId, result: toEstimateResult(raw.result) };\n }\n return raw;\n}\n\nexport interface StartedEstimate {\n estimateId: string;\n /**\n * Id of the auction backing this estimate. Usable with {@link getAuction} once a\n * resolved auction has dropped off `GET /auctions` / `GET /guardians/:address/auctions`\n * — most callers never need it and can just poll {@link getEstimateResult}.\n */\n auctionId: string;\n}\n\n/**\n * Starts a cost estimate via `POST /estimate`.\n *\n * Asynchronous: returns as soon as the rate auction is created, well before it\n * resolves (~`AUCTION_WINDOW_MS`, 5000ms by default). Poll {@link getEstimateResult}\n * with the returned id for the outcome, or use {@link waitForEstimate} to do both in\n * one call.\n *\n * Not idempotent — every call starts a brand-new auction with a new id, and can\n * resolve to a different `estimatedCost` even for identical input.\n *\n * @throws {CostEstimationError} 400 if `computeMode` is missing/invalid; 422 if no\n * guardians are eligible for that mode (do not tight-loop retry).\n */\nexport async function startEstimate(params: ContractParams): Promise<StartedEstimate> {\n return costEstimationClient.post<StartedEstimate>(\"/estimate\", params);\n}\n\n/**\n * Fetches the current state of an estimate started via {@link startEstimate}.\n *\n * `auctionedRate`, `estimatedCost`, and `feeThreshold` are returned as `bigint` —\n * never treat them as floating-point numbers.\n *\n * @throws {CostEstimationError} 404 if `estimateId` is unrecognized (terminal — a\n * restart of the service does not invalidate a previously issued id).\n */\nexport async function getEstimateResult(\n estimateId: string,\n): Promise<EstimateStatusResponse> {\n const raw = await costEstimationClient.get<RawEstimateStatusResponse>(\n `/estimates/${encodeURIComponent(estimateId)}`,\n );\n return toEstimateStatusResponse(raw);\n}\n\nexport interface WaitForEstimateOptions {\n /** Milliseconds between polls. Defaults to 5000ms (the service's default auction window). */\n intervalMs?: number;\n /** Upper bound on total wait time in milliseconds. Defaults to 60000ms. */\n timeoutMs?: number;\n}\n\n/**\n * Starts an estimate and polls {@link getEstimateResult} until it leaves\n * `\"pending\"`, spacing requests `intervalMs` apart rather than tight-looping.\n *\n * Resolves with the terminal `\"completed\"` or `\"failed\"` status. Rejects if\n * `timeoutMs` elapses first — the estimate keeps running server-side regardless,\n * and can still be recovered later via {@link getEstimateResult} with the same id.\n */\nexport async function waitForEstimate(\n params: ContractParams,\n options: WaitForEstimateOptions = {},\n): Promise<{ estimateId: string; status: EstimateStatusResponse }> {\n const { intervalMs = 5000, timeoutMs = 60000 } = options;\n const { estimateId } = await startEstimate(params);\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n const status = await getEstimateResult(estimateId);\n if (status.status !== \"pending\") {\n return { estimateId, status };\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error(\n `waitForEstimate: estimate ${estimateId} still pending after ${timeoutMs}ms`,\n );\n }\n await sleep(Math.min(intervalMs, remaining));\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n","import type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { u8aToHex } from \"@polkadot/util\";\nimport { costEstimationClient } from \"./client\";\nimport type { AuctionDetail, AuctionWinner, OpenAuction, ResolvedAuction } from \"./types\";\n\ninterface RawOpenAuctionsResponse {\n auctions: OpenAuction[];\n}\n\ninterface RawAuctionWinner {\n guardian: string;\n rate: string;\n}\n\ninterface RawAuctionDetail {\n auctionId: string;\n contractId: string;\n guardians: string[];\n deadline: number;\n resolved: boolean;\n winner?: RawAuctionWinner;\n}\n\ninterface RawResolvedAuctionsResponse {\n auctions: (Omit<RawAuctionDetail, \"resolved\"> & { winner: RawAuctionWinner })[];\n}\n\nfunction toAuctionWinner(raw: RawAuctionWinner): AuctionWinner {\n return { guardian: raw.guardian, rate: BigInt(raw.rate) };\n}\n\n/**\n * Lists currently open (unresolved) auctions via `GET /auctions`, so a guardian can\n * discover an `auctionId` while it is still running in the background after a\n * {@link startEstimate} call returned. Only relevant when acting on behalf of a\n * guardian — a plain cost lookup never needs this.\n */\nexport async function listOpenAuctions(): Promise<OpenAuction[]> {\n const { auctions } =\n await costEstimationClient.get<RawOpenAuctionsResponse>(\"/auctions\");\n return auctions;\n}\n\n/**\n * Same as {@link listOpenAuctions}, pre-filtered server-side (via\n * `GET /guardians/:address/auctions`) to auctions `guardianAddress` is eligible for.\n */\nexport async function listGuardianAuctions(\n guardianAddress: string,\n): Promise<OpenAuction[]> {\n const { auctions } = await costEstimationClient.get<RawOpenAuctionsResponse>(\n `/guardians/${encodeURIComponent(guardianAddress)}/auctions`,\n );\n return auctions;\n}\n\n/**\n * Looks up a single auction via `GET /auctions/:id`, regardless of resolution status.\n * A resolved auction is never deleted from the service's store, only excluded from\n * {@link listOpenAuctions} / {@link listGuardianAuctions} — this is the only way to\n * retrieve its outcome (including the winning guardian's address) once resolved.\n *\n * @throws {CostEstimationError} 404 if `auctionId` is unrecognized — terminal.\n */\nexport async function getAuction(auctionId: string): Promise<AuctionDetail> {\n const raw = await costEstimationClient.get<RawAuctionDetail>(\n `/auctions/${encodeURIComponent(auctionId)}`,\n );\n return {\n auctionId: raw.auctionId,\n contractId: raw.contractId,\n guardians: raw.guardians,\n deadline: raw.deadline,\n resolved: raw.resolved,\n winner: raw.winner ? toAuctionWinner(raw.winner) : undefined,\n };\n}\n\n/**\n * Lists auctions `guardianAddress` was eligible for and that have since resolved, via\n * `GET /guardians/:address/auctions?resolved=true`. Use this instead of\n * {@link listGuardianAuctions} (which only ever shows currently open auctions) when\n * fetching a confirmed auction for a guardian you don't already have an `auctionId`\n * for — no need to guess the guardian's `computeMode` and start a throwaway estimate.\n */\nexport async function listResolvedGuardianAuctions(\n guardianAddress: string,\n): Promise<ResolvedAuction[]> {\n const { auctions } = await costEstimationClient.get<RawResolvedAuctionsResponse>(\n `/guardians/${encodeURIComponent(guardianAddress)}/auctions?resolved=true`,\n );\n return auctions.map((a) => ({\n auctionId: a.auctionId,\n contractId: a.contractId,\n guardians: a.guardians,\n deadline: a.deadline,\n winner: toAuctionWinner(a.winner),\n }));\n}\n\n/**\n * Submits a signed rate bid into an open auction via `POST /auctions/:id/bid`,\n * signed with `guardian`'s sr25519 key over the literal string\n * `${auctionId}:${rate}`, as required by the service.\n *\n * Lowest `rate` wins; ties break by earliest submission time, then by\n * lexicographically smallest address. A guardian that never bids keeps its default\n * entry — its own on-chain threshold for the compute type this auction was opened\n * for, which reads as zero when it declared none.\n *\n * @param rate - Bid rate as a decimal-integer string, in atomic units.\n * @throws {CostEstimationError} 422 if the auction is unknown, already closed, or\n * `guardian` isn't in its eligible set — terminal, do not retry the same bid.\n */\nexport async function submitAuctionBid(\n auctionId: string,\n rate: string,\n guardian: KeyringPair,\n): Promise<void> {\n const signature = u8aToHex(guardian.sign(`${auctionId}:${rate}`));\n await costEstimationClient.post<{ status: \"accepted\" }>(\n `/auctions/${encodeURIComponent(auctionId)}/bid`,\n { guardian: guardian.address, rate, signature },\n );\n}\n","import type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { u8aToHex } from \"@polkadot/util\";\nimport { costEstimationClient } from \"./client\";\n\n/**\n * Registers a webhook URL for `guardian` via `POST /guardians/:address/webhook`, so\n * it gets a best-effort push (`{ auctionId, contractId, deadline }`) whenever it's\n * placed in a new auction, instead of polling {@link listGuardianAuctions}.\n *\n * Signed with `guardian`'s sr25519 key over the literal string `webhook:${url}`, as\n * required by the service — this binds the registration to the exact URL so it\n * can't be replayed to redirect notifications elsewhere.\n *\n * Replaces any previously registered webhook for this guardian; there is no\n * list/unregister endpoint. Delivery is best-effort and unawaited by the service —\n * a failed push is only logged server-side, never retried, so don't rely on this as\n * a substitute for polling if missing an auction would be costly.\n *\n * @throws {CostEstimationError} 400 if `url` isn't an absolute http(s) URL; 404 if\n * `guardian` has no resolvable on-chain guardian entry; 422 if the signature doesn't\n * verify.\n */\nexport async function registerGuardianWebhook(\n url: string,\n guardian: KeyringPair,\n): Promise<void> {\n const signature = u8aToHex(guardian.sign(`webhook:${url}`));\n await costEstimationClient.post<void>(\n `/guardians/${encodeURIComponent(guardian.address)}/webhook`,\n { url, signature },\n );\n}\n","import { costEstimationClient } from \"./client\";\n\n/**\n * Liveness probe via `GET /health`. Does not verify chain connectivity — a healthy\n * response does not guarantee {@link startEstimate} will succeed.\n */\nexport async function healthCheck(): Promise<boolean> {\n const { status } = await costEstimationClient.get<{ status: string }>(\"/health\");\n return status === \"ok\";\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount, toAtomicPaliAmount } from \"../utils/token\";\nimport { CipherSuite, OnChainRef } from \"./types\";\nimport type { Fee } from \"../chain/types\";\nimport type { StoreType } from \"../compute/agreement\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function writeMetadata(\n account: KeyringPair,\n name: string,\n description: string,\n ref: OnChainRef,\n price: bigint,\n dataType: number,\n l2Owner: string,\n groupId: string,\n) {\n const blobRef = [ref.blockNumber, ref.index];\n const encoder = new TextEncoder();\n const nameBytes = Array.from(encoder.encode(name));\n const descriptionBytes = Array.from(encoder.encode(description));\n const ownerBytes = Array.from(encoder.encode(l2Owner));\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n debugLog(`Registering metadata for ${name} at ${formatPaliAmount(price)}`);\n\n const request = api.tx.dataAvailability.daccRegisterData(\n nameBytes,\n descriptionBytes,\n blobRef,\n price,\n dataType,\n ownerBytes,\n groupId,\n );\n\n const hash = await signAndSend(request, account);\n\n debugLog(`Metadata registration transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n\n\nexport interface DataAgreementMetadata {\n name: string;\n description: string;\n /** Maps to the on-chain StoreType enum. */\n storeType: StoreType;\n /** H256 group identifier. */\n groupId: string;\n};\n\nexport interface DataAgreementParams {\n /** DA blob reference returned by submitTEData. */\n ref: OnChainRef;\n /** Guardian account IDs that participate in this agreement. */\n guardians: string[];\n /**\n * Absolute fee for the agreement. `computeRate` is omitted: this is a\n * `Dormant` contract and the compute rate only applies to `Active` contracts.\n */\n fee: Pick<Fee, \"amount\">;\n /** If provided, populates ComputeInfo.metadata in the contract. */\n metadata?: DataAgreementMetadata;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n /**\n * CipherSuite for the compute step input. Defaults to \"Plaintext\".\n * Pass the `cipher` from submitTEDataWithCipher for the threshold-encrypted path.\n */\n cipher?: CipherSuite;\n /**\n * CipherSuite for the agreement result. Defaults to \"Plaintext\".\n */\n resultCipher?: CipherSuite;\n}\n\nexport async function registerDataAgreement(\n account: KeyringPair,\n params: DataAgreementParams,\n) {\n debugLog(\n `Registering data agreement for DA ref ${params.ref.blockNumber}-${params.ref.index} at ${formatPaliAmount(toAtomicPaliAmount(params.fee.amount ?? \"0\"))}`,\n );\n\n const cipher = params.cipher ?? \"Plaintext\";\n const resultCipher = params.resultCipher ?? \"Plaintext\";\n const computeMetadata = buildComputeMetadata(params.metadata);\n\n const computeStep = {\n cipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: {\n ChainTransaction: {\n blockNumber: params.ref.blockNumber,\n extrinsicIndex: params.ref.index,\n },\n },\n program: {\n NativeData: \"DaFalse\",\n },\n metadata: computeMetadata,\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { OnChainRef } from \"./types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function runAgent(\n account: KeyringPair,\n agentRef: OnChainRef,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n tdParams: Uint8Array,\n pkBytes: Uint8Array,\n tauParams: Uint8Array,\n baseModel: OnChainRef,\n publicKey: Uint8Array,\n guardians: Uint8Array[],\n guardian?: Uint8Array,\n agreementId?: Uint8Array,\n) {\n const agentRefTuple = [agentRef.blockNumber, agentRef.index];\n const baseModelTuple = [baseModel.blockNumber, baseModel.index];\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = api.tx.dataAvailability.daccRunAgent(\n agentRefTuple,\n Array.from(nonce),\n Array.from(ciphertext),\n guardian ? Array.from(guardian) : null,\n Array.from(tdParams),\n Array.from(pkBytes),\n Array.from(tauParams),\n baseModelTuple,\n Array.from(publicKey),\n guardians.map((g) => Array.from(g)),\n );\n\n const opts = {\n compute: {\n daType: 4,\n verification: 0,\n compute: 1,\n agreement: [agreementId]\n }\n };\n const hash = await signAndSend(request, account, opts);\n\n debugLog(`Run agent transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n","import { DEFAULT_EMPTY_PAYLOAD, getApi, signAndSend } from \"../chain\";\nimport { encrypt, gen_stretched_key, testCrypt } from \"../crypto\";\nimport {\n assert,\n debugLog,\n Hex,\n hexToUint8Array,\n uint8ArrayToBase64,\n} from \"../utils\";\nimport { OnChainRef, SubmitTEDataResult } from \"./types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function submitData(account: KeyringPair, data: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nSubmitting data with content length: ${data.length}`);\n\n const tx = api.tx.dataAvailability.submitData(data);\n const hash = await signAndSend(tx, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`Data availability transaction sent with hash: ${hash.hash}`);\n}\n\nexport async function submitTEData(\n account: KeyringPair,\n data: string,\n chosenGuardians: string[],\n tau_params: string,\n agg_key: string,\n group_pk: string,\n): Promise<OnChainRef> {\n const { encoded: encryptedKey, ikm } = testCrypt(tau_params, agg_key);\n const td_params = uint8ArrayToBase64(hexToUint8Array(encryptedKey as Hex));\n const shared_key = gen_stretched_key(hexToUint8Array(ikm as Hex));\n\n const encoder = new TextEncoder();\n const dataUint8Array = encoder.encode(data);\n const { ciphertext, nonce } = encrypt(dataUint8Array, shared_key);\n\n const modelSubmit = JSON.stringify({\n nonce: uint8ArrayToBase64(nonce),\n ciphertext: uint8ArrayToBase64(ciphertext),\n td_params,\n group_pk: Array.from(new Uint8Array(hexToUint8Array(group_pk as Hex))),\n tau_params: Array.from(new Uint8Array(hexToUint8Array(tau_params as Hex))),\n chosen_guardians: chosenGuardians,\n });\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = await api.tx.dataAvailability.submitData(modelSubmit);\n const hash = await signAndSend(request, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`TE data availability transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n\n/**\n * Identical to submitTEData but additionally returns the populated CipherSuite\n * so callers can pass it directly to registerDataAgreement without\n * re-deriving the cipher parameters.\n */\nexport async function submitTEDataWithCipher(\n account: KeyringPair,\n data: string,\n chosenGuardians: string[],\n tau_params: string,\n agg_key: string,\n group_pk: string,\n): Promise<SubmitTEDataResult> {\n const { encoded: encryptedKey, ikm } = testCrypt(tau_params, agg_key);\n const shared_key = gen_stretched_key(hexToUint8Array(ikm as Hex));\n\n const encoder = new TextEncoder();\n const dataUint8Array = encoder.encode(data);\n const { ciphertext, nonce } = encrypt(dataUint8Array, shared_key);\n\n const ciphertextHex =\n \"0x\" +\n Array.from(ciphertext)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = await api.tx.dataAvailability.submitData(ciphertextHex);\n const ref = await signAndSend(request, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`TE data availability transaction sent with hash: ${ref.hash}`);\n\n return {\n ref,\n cipher: {\n ThresholdHybrid: {\n thresholdParams: {\n SilentThreshold: {\n tdParams: Array.from(hexToUint8Array(encryptedKey as Hex)),\n pkBytes: Array.from(hexToUint8Array(group_pk as Hex)),\n tauParams: Array.from(hexToUint8Array(tau_params as Hex)),\n },\n },\n symmetricParams: {\n ChaCha20Poly1305: { nonce: Array.from(nonce) },\n },\n },\n },\n };\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport bs58 from \"bs58\";\nimport { getApi, getKeyring, MCryptFsWriter } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { toAtomicPaliAmount } from \"../utils/token\";\nimport { UploadOptions } from \"./types\";\nimport { submitTEData, submitTEDataWithCipher } from \"./submit\";\nimport { registerDataAgreement, writeMetadata } from \"./register\";\n\nexport async function uploadData(options: UploadOptions) {\n const { name, description, price, type, guardianGroupInfo, ref, filePath } =\n options;\n\n assert(\n guardianGroupInfo.guardians &&\n guardianGroupInfo.tauParams &&\n guardianGroupInfo.aggKey &&\n guardianGroupInfo.groupPk,\n \"Guardian group info is missing required properties\",\n );\n console.log(\"Guardian group info:\", guardianGroupInfo);\n\n const account = (await getKeyring()).pairs[0];\n\n if (filePath) {\n throw new Error(\"uploadData: file path upload is not implemented\");\n } else {\n const storeType =\n type === \"model\" ? \"Model\" : type === \"agent\" ? \"Agent\" : type === \"executable\" ? \"Executable\" : \"Dataset\";\n const { ref: dataRef, cipher } = await submitTEDataWithCipher(\n account,\n ref || \"\",\n guardianGroupInfo.guardians,\n guardianGroupInfo.tauParams,\n guardianGroupInfo.aggKey,\n guardianGroupInfo.groupPk,\n );\n await registerDataAgreement(account, {\n ref: dataRef,\n guardians: guardianGroupInfo.guardians,\n fee: { amount: price },\n cipher,\n metadata: {\n name,\n description,\n storeType,\n groupId: guardianGroupInfo.groupId,\n },\n });\n }\n}\n\n/**\n * Legacy upload: uses submitTEData (returns only OnChainRef) and registers\n * the agreement with Plaintext cipher and no ComputePayload opts.\n * Kept for backward compatibility with callers that do not need cipher\n * parameters surfaced in the on-chain agreement.\n */\nexport async function uploadDataLegacy(options: Omit<UploadOptions, \"opts\">) {\n const { name, description, price, type, guardianGroupInfo, ref, filePath } =\n options;\n\n assert(\n guardianGroupInfo.guardians &&\n guardianGroupInfo.tauParams &&\n guardianGroupInfo.aggKey &&\n guardianGroupInfo.groupPk,\n \"Guardian group info is missing required properties\",\n );\n\n const account = (await getKeyring()).pairs[0];\n const ethAddress = \"\";\n const atomicPrice = toAtomicPaliAmount(price);\n\n if (type === \"dataset\" && filePath) {\n const fileContent = fs.readFileSync(filePath);\n const selectedFile = new File([fileContent], path.basename(filePath), {\n type: \"application/octet-stream\",\n lastModified: Date.now(),\n });\n\n const msCryptFsWriter = new MCryptFsWriter(\n {\n file: selectedFile,\n fileName: selectedFile.name,\n filePath: \"\",\n description,\n baseCost: atomicPrice,\n ownerL2Address: ethAddress,\n guardianInfo: guardianGroupInfo,\n },\n 500,\n await getApi(),\n account,\n );\n\n await msCryptFsWriter.writeFile();\n } else {\n const dataRef = await submitTEData(\n account,\n ref || \"\",\n guardianGroupInfo.guardians,\n guardianGroupInfo.tauParams,\n guardianGroupInfo.aggKey,\n guardianGroupInfo.groupPk,\n );\n\n const dtype = type === \"model\" ? 1 : type === \"agent\" ? 2 : type === \"executable\" ? 4 : 0;\n await writeMetadata(\n account,\n name,\n description,\n dataRef,\n BigInt(Number(price) * 10 ** 18),\n dtype,\n ethAddress,\n guardianGroupInfo.groupId,\n );\n }\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function addStake(account: KeyringPair, amountBaseUnits: bigint) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\"Using account:\", account.address, \"adding:\", formatPaliAmount(amountBaseUnits));\n\n const stakeTx = api.tx.staking.bondExtra(amountBaseUnits);\n const hash = await signAndSend(stakeTx, account);\n\n debugLog(`Stake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function joinIdleStaker(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const chillTx = api.tx.staking.chill();\n const hash = await signAndSend(chillTx, account);\n\n debugLog(\"Idle staker chill tx sent with hash:\", hash.hash);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function newStake(\n account: KeyringPair,\n amountBaseUnits: bigint,\n rewardDestination: string = \"Staked\"\n) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\n `Staking amount: ${formatPaliAmount(amountBaseUnits)} for account: ${account.address} with reward destination: ${rewardDestination}`\n );\n\n const stakeTx = api.tx.staking.bond(amountBaseUnits, rewardDestination);\n const hash = await signAndSend(stakeTx, account);\n\n debugLog(`Stake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function payoutStake(account: KeyringPair, eras: Array<number>, address?: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n for (const era of eras) {\n debugLog(\"Paying account: \", address || account.address, \" for era \", era);\n }\n\n const unstakeTxs = eras.map((era) =>\n api.tx.staking.payoutStakers(address || account.address, era)\n );\n const batchTx = api.tx.utility.batch(unstakeTxs);\n const hash = await signAndSend(batchTx, account);\n\n debugLog(`Batch payout transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function reduceStake(account: KeyringPair, amountBaseUnits: bigint) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\"Using account:\", account.address, \"reducing:\", formatPaliAmount(amountBaseUnits));\n\n const unstakeTx = api.tx.staking.unbond(amountBaseUnits);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function removeStake(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const stakeAmount = (await api.query.staking.ledger(account.address))?.toPrimitive() as { active?: bigint } | null;\n\n debugLog(\"Removing entire stake amount:\", formatPaliAmount(stakeAmount?.active || 0n));\n\n const unstakeTx = api.tx.staking.unbond(stakeAmount?.active || 0n);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function withdrawStake(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const unstakeTx = api.tx.staking.withdrawUnbonded(0);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getAuthServiceUrl, getAwsRegion, getAwsS3Bucket } from \"../config\";\nimport { StorageProvider } from \"./types\";\n\nexport class S3Provider implements StorageProvider {\n public readonly id = \"s3\";\n\n getDeterministicUrl(hash: string): string {\n return `https://${getAwsS3Bucket()}.s3.${getAwsRegion()}.amazonaws.com/Contracts/${hash}`;\n }\n\n async getUploadUrl(\n txHash: string,\n fileHash: string,\n blockNumber: number,\n expectedUrl: string,\n ): Promise<string> {\n const response = await fetch(`${getAuthServiceUrl()}/api/s3/auth`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, fileHash, blockNumber, url: expectedUrl })\n });\n\n if (!response.ok) {\n let errorMessage = response.statusText;\n try {\n const errData = await response.json();\n if (errData.error) errorMessage = errData.error;\n } catch {\n // Ignore json parse error\n }\n throw new Error(`Auth Service failed: ${errorMessage}`);\n }\n\n const { presignedUrl } = await response.json();\n if (!presignedUrl) {\n throw new Error(\"No presignedUrl returned from Auth Service\");\n }\n return presignedUrl;\n }\n\n async upload(url: string, data: Uint8Array): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: data as unknown as BodyInit\n });\n\n if (!response.ok) {\n throw new Error(`Storage Upload failed: ${response.statusText}`);\n }\n }\n}\n","import { S3Provider } from \"./s3\";\nimport { StorageProvider } from \"./types\";\n\nexport class StorageRouter {\n private providers: Map<string, StorageProvider>;\n private defaultProvider: string;\n\n constructor() {\n this.providers = new Map();\n this.register(new S3Provider());\n this.defaultProvider = \"s3\";\n }\n\n public register(provider: StorageProvider) {\n this.providers.set(provider.id, provider);\n }\n\n public getProvider(id?: string): StorageProvider {\n const targetId = id || this.defaultProvider;\n const provider = this.providers.get(targetId);\n if (!provider) {\n throw new Error(`Storage provider '${targetId}' not found`);\n }\n return provider;\n }\n}\n\nexport const storageRouter = new StorageRouter();\n","import { getApi, getKeyring, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function fundAccount(account: KeyringPair, amountBaseUnits: bigint, address?: string) {\n const addr = address ? address : account.address;\n const keyring = await getKeyring();\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nFunding account: ${addr} with amount: ${formatPaliAmount(amountBaseUnits)}`);\n\n const tx = api.tx.balances.transferKeepAlive(addr, amountBaseUnits);\n const hash = await signAndSend(tx, keyring.getPairs()[0]);\n\n debugLog(`Fund transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function transfer(account: KeyringPair, amountBaseUnits: bigint, address: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nTransferring funds to account: ${address} with amount: ${formatPaliAmount(amountBaseUnits)}`);\n\n const tx = api.tx.balances.transferKeepAlive(address, amountBaseUnits);\n const hash = await signAndSend(tx, account);\n\n debugLog(`Transfer transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function joinValidator(account: KeyringPair, commission: number) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const validateTx = api.tx.staking.validate({commission, blocked: true});\n const hash = await signAndSend(validateTx, account);\n\n debugLog(\"Validator join tx sent with hash:\", hash.hash);\n}\n","import assert from \"assert\";\nimport { getApi, signAndSend } from \"./chain\";\nimport { debugLog } from \"./utils/helper\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport interface IdentityFields {\n\tdisplay?: string;\n}\n\nexport async function setIdentity(account: KeyringPair, { display = undefined }: IdentityFields) {\n\tconst api = await getApi();\n\n\tassert(api, \"API not initialized\");\n\n\tdebugLog(`\\nSetting identity for account: ${account.address} as ${display}`);\n\n\tconst tx = api.tx.identity.setIdentity({display: {Raw: display}});\n\tconst hash = await signAndSend(tx, account);\n\n\tdebugLog(`Set identity transaction sent with hash: ${hash.hash}`);\n}\n\n","// ---------------------------------------------------------------------------\n// IndexerClient — configurable HTTP client for the @statescan/indexer REST API\n// ---------------------------------------------------------------------------\n\nimport type { ErrorResponse } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:5020\";\n\nexport interface IndexerClientOptions {\n /** Base URL of the indexer server (default: `http://localhost:5020`). */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to the global `fetch`.\n * Useful for injecting a test double or a polyfill in older Node versions.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Lightweight wrapper around `fetch` that targets the `@statescan/indexer` REST API.\n *\n * Every public method on the domain modules receives an `IndexerClient` instance,\n * keeping configuration (base URL, custom fetch) in one place.\n *\n * @example\n * ```ts\n * import { IndexerClient } from \"@palliora.org/chainsdk\";\n *\n * const client = new IndexerClient({ baseUrl: \"https://indexer.palliora.org\" });\n * ```\n */\nexport class IndexerClient {\n readonly baseUrl: string;\n private readonly _fetch: typeof globalThis.fetch;\n\n constructor(options: IndexerClientOptions = {}) {\n // Paths already include `/api/...`, so a baseUrl of `.../api` would become\n // `/api/api/...` and 404. Strip trailing slashes and an accidental `/api` suffix.\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL)\n .replace(/\\/+$/, \"\")\n .replace(/\\/api$/i, \"\");\n this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n /**\n * Performs a GET request against the indexer and returns the parsed JSON body.\n *\n * @throws {IndexerHttpError} When the response indicates failure (`success: false`)\n * or the HTTP status is not 2xx.\n */\n async get<T>(\n path: string,\n params?: Record<string, string | number | boolean | null | undefined>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const response = await this._fetch(url.toString(), {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n\n const raw = await response.text();\n let body: unknown;\n try {\n body = raw ? JSON.parse(raw) : null;\n } catch {\n if (!response.ok) {\n throw new IndexerHttpError(\n response.status,\n raw || response.statusText,\n );\n }\n throw new IndexerHttpError(\n response.status,\n `Invalid JSON response from ${url.toString()}: ${raw.slice(0, 120)}`,\n );\n }\n\n if (!response.ok) {\n const errBody = body as ErrorResponse;\n throw new IndexerHttpError(\n response.status,\n errBody?.message ?? response.statusText,\n );\n }\n\n return body as T;\n }\n}\n\n/**\n * Error thrown when the indexer returns a non-2xx response or an error envelope.\n */\nexport class IndexerHttpError extends Error {\n readonly statusCode: number;\n\n constructor(statusCode: number, message: string) {\n super(message);\n this.name = \"IndexerHttpError\";\n this.statusCode = statusCode;\n }\n}\n","import { StoreType } from \"../compute\";\nimport type { IndexerClient } from \"./client\";\nimport type {\n ArtefactDocument,\n ArtefactsQuery,\n ArtefactAccessQuery,\n ArtefactContractsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch all artefacts, optionally filtered by type.\n *\n * `GET /api/artefacts`\n *\n * For UI categorization by `storeType`, prefer the dedicated helpers:\n * {@link getDatasets}, {@link getModels}, {@link getAgents}, {@link getExecutables}.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filter — `storeType` / `artefactType`\n * @returns `{ success: true, data: ArtefactDocument[] }`\n */\nexport async function getArtefacts(\n client: IndexerClient,\n query?: ArtefactsQuery,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return client.get(\"/api/artefacts\", query ? { ...query } : undefined);\n}\n\n/**\n * Fetch artefacts filtered by `storeType`.\n *\n * Loads `/api/artefacts` and filters client-side so results are reliable even when\n * the indexer ignores the `storeType` query param.\n */\nexport async function getArtefactsByStoreType(\n client: IndexerClient,\n storeType: StoreType,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n const response = await getArtefacts(client);\n return {\n success: true,\n data: response.data.filter((item) => item.storeType === storeType),\n };\n}\n\n/** Fetch artefacts with `storeType: \"Dataset\"`. */\nexport async function getDatasets(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Dataset\");\n}\n\n/** Fetch artefacts with `storeType: \"Model\"`. */\nexport async function getModels(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Model\");\n}\n\n/** Fetch artefacts with `storeType: \"Agent\"`. */\nexport async function getAgents(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Agent\");\n}\n\n/** Fetch artefacts with `storeType: \"Executable\"`. */\nexport async function getExecutables(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Executable\");\n}\n\n/**\n * Fetch a single artefact by its contract ID.\n *\n * `GET /api/artefact/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `contractId` of the artefact\n */\nexport async function getArtefact(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ArtefactDocument>> {\n return client.get(`/api/artefact/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch access records for a specific artefact.\n *\n * `GET /api/artefact/:id/access`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `contractId` of the artefact\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getArtefactAccess(\n client: IndexerClient,\n id: string,\n query?: ArtefactAccessQuery,\n): Promise<SuccessResponse<unknown[]>> {\n return client.get(\n `/api/artefact/${encodeURIComponent(id)}/access`,\n query ? { ...query } : undefined,\n );\n}\n\nfunction nestedContractId(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && \"id\" in value) {\n const id = (value as { id?: unknown }).id;\n return typeof id === \"string\" ? id : undefined;\n }\n return undefined;\n}\n\n/** True when `doc` is a compute contract that references this artefact. */\nexport function isArtefactUsage(doc: Record<string, unknown> | null | undefined, artefactId: string): boolean {\n if (!doc || doc.contractId === artefactId) return false;\n if (doc.inputContractId === artefactId) return true;\n const compute = doc.compute as Record<string, Record<string, unknown>> | undefined;\n const inputId = nestedContractId(compute?.input?.contractId);\n const programId = nestedContractId(compute?.program?.contractId);\n return inputId === artefactId || programId === artefactId;\n}\n\n/**\n * Fetch compute contracts that use this artefact as input or program.\n *\n * `GET /api/artefact/:id/contracts`\n *\n * Older indexers returned the artefact document itself. In that case this\n * helper scans `/api/artefacts` and keeps rows that reference the artefact.\n *\n * @param client Configured {@link IndexerClient}\n * @param id The artefact `contractId`\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getArtefactContracts(\n client: IndexerClient,\n id: string,\n query?: ArtefactContractsQuery,\n): Promise<SuccessResponse<unknown[]>> {\n const response = await client.get<SuccessResponse<unknown[]>>(\n `/api/artefact/${encodeURIComponent(id)}/contracts`,\n query ? { ...query } : undefined,\n );\n const list = Array.isArray(response.data) ? response.data : [];\n const usages = list.filter((item) => isArtefactUsage(item as Record<string, unknown>, id));\n if (usages.length > 0) {\n return { ...response, data: usages };\n }\n\n const looksLikeSelfOnly =\n list.length > 0 &&\n list.every((item) => (item as { contractId?: string })?.contractId === id);\n\n if (!looksLikeSelfOnly) {\n return {\n ...response,\n data: list.filter((item) => (item as { contractId?: string })?.contractId !== id),\n };\n }\n\n const artefacts = await getArtefacts(client);\n return {\n success: true,\n data: (artefacts.data || []).filter((item) =>\n isArtefactUsage(item as unknown as Record<string, unknown>, id),\n ),\n };\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n ContractDocument,\n ContractsQuery,\n ComputeDocument,\n PaginatedResponse,\n ResultDocument,\n ResultsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a paginated list of contracts.\n *\n * `GET /api/contracts`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size` (default 25)\n * @returns `{ success: true, data: ContractDocument[], total: number }`\n */\nexport async function getContracts(\n client: IndexerClient,\n query?: ContractsQuery,\n): Promise<PaginatedResponse<ContractDocument>> {\n return client.get(\"/api/contracts\", query ? { ...query } : undefined);\n}\n\n/**\n * Fetch a single contract by its ID.\n *\n * `GET /api/contract/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The contract identifier\n */\nexport async function getContract(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ContractDocument>> {\n return client.get(`/api/contract/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch compute request data for a specific contract.\n *\n * `GET /api/compute/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The contract identifier\n */\nexport async function getCompute(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ComputeDocument>> {\n return client.get(`/api/compute/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch compute results for a contract from `palliora-compute.results`.\n *\n * `GET /api/results?contractId=`\n */\nexport async function getResults(\n client: IndexerClient,\n query: ResultsQuery,\n): Promise<SuccessResponse<ResultDocument[]>> {\n return client.get(\"/api/results\", { contractId: query.contractId });\n}\n\n/**\n * Fetch a single compute result by `resultId`.\n *\n * `GET /api/result/:id`\n */\nexport async function getResult(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ResultDocument>> {\n return client.get(`/api/result/${encodeURIComponent(id)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { BlobDocument, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a blob by its block-height ID.\n *\n * `GET /api/blob/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id Block height (integer) identifying the blob\n */\nexport async function getBlob(\n client: IndexerClient,\n id: number,\n): Promise<SuccessResponse<BlobDocument>> {\n return client.get(`/api/blob/${encodeURIComponent(String(id))}`);\n}\n","import { IndexerHttpError, type IndexerClient } from \"./client\";\nimport { getArtefact, getArtefactAccess } from \"./artefacts\";\nimport { getBlob } from \"./blobs\";\nimport { getCompute, getContract, getResults } from \"./contracts\";\nimport type {\n ArtefactDocument,\n ArtefactAccessQuery,\n ArtefactFlow,\n BlobDocument,\n ComputeDocument,\n ContractDocument,\n ContractFlow,\n ContractFlowPhase,\n ContractFlowStatus,\n ResultDocument,\n SuccessResponse,\n} from \"./types\";\n\nexport type ComputeInput = ComputeDocument | ComputeDocument[] | null | undefined;\n\nfunction computeTime(item: ComputeDocument): number {\n return item.indexer?.blockTime ?? 0;\n}\n\nfunction isComputeRequest(item: ComputeDocument): boolean {\n return Boolean(\n item.jobId ||\n item.orchestrator ||\n item.resultTx ||\n item.computeReward ||\n item.decryptionFee,\n );\n}\n\nexport function normalizeComputes(compute: ComputeInput): ComputeDocument[] {\n if (!compute) return [];\n const list = Array.isArray(compute)\n ? compute\n : Array.isArray((compute as ComputeDocument & { computes?: ComputeDocument[] }).computes)\n ? (compute as ComputeDocument & { computes: ComputeDocument[] }).computes\n : [compute];\n return [...list]\n .filter(isComputeRequest)\n .sort((a, b) => computeTime(a) - computeTime(b));\n}\n\n/**\n * Map a `palliora-compute.results` row onto the compute-request shape used by\n * session phases (jobId, orchestrator, resultTx, fees).\n */\nexport function resultToCompute(result: ResultDocument): ComputeDocument {\n const indexer = result.indexer;\n return {\n ...result,\n jobId: result.resultId,\n contractId: result.contractId,\n orchestrator: result.submitor,\n resultTx: indexer\n ? {\n blockHeight: indexer.blockHeight,\n extrinsicIndex: indexer.extrinsicIndex,\n blockHash: indexer.blockHash,\n hash: indexer.blockHash,\n }\n : { hash: result.resultId },\n computeReward: result.feeBreakdown?.submitorFee?.amount,\n fee: result.feeBreakdown?.resultFee,\n decryptionFee: result.feeBreakdown?.thresholdDecryptionFee,\n indexer,\n };\n}\n\nfunction mergeComputes(\n fromResults: ComputeDocument[],\n fromCompute: ComputeDocument[],\n): ComputeDocument[] {\n if (fromResults.length === 0) return fromCompute;\n const ids = new Set(\n fromResults.flatMap((item) => [item.jobId, item.contractId].filter(Boolean) as string[]),\n );\n const extras = fromCompute.filter(\n (item) => !ids.has(item.jobId ?? \"\") && !ids.has(item.contractId ?? \"\"),\n );\n return normalizeComputes([...fromResults, ...extras]);\n}\n\nfunction withParties(agreement: ContractDocument): ContractDocument {\n if (agreement.parties?.length) return agreement;\n const guardians = (agreement as ContractDocument & { guardians?: string[] }).guardians;\n if (Array.isArray(guardians) && guardians.length) {\n return { ...agreement, parties: guardians };\n }\n return agreement;\n}\n\nexport function deriveContractStatus(\n agreement: ContractDocument | null | undefined,\n compute: ComputeInput,\n): ContractFlowStatus | \"—\" {\n if (!agreement) return \"—\";\n const computes = normalizeComputes(compute);\n if (computes.length === 0) {\n return (agreement.responses?.length ?? 0) > 0 ? \"ACCEPTED\" : \"PENDING\";\n }\n if (computes.every((item) => !!item.resultTx)) return \"COMPLETED\";\n return \"PROCESSING\";\n}\n\nexport function buildContractPhases(\n agreement: ContractDocument | null | undefined,\n compute: ComputeInput,\n): ContractFlowPhase[] {\n const computes = normalizeComputes(compute);\n const latest = computes[computes.length - 1] ?? null;\n const settledCount = computes.filter((item) => !!item.resultTx).length;\n const status = deriveContractStatus(agreement, computes);\n const phase1Active = !!agreement;\n const phase1Complete = status === \"ACCEPTED\" || status === \"PROCESSING\" || status === \"COMPLETED\";\n const phase2Active = computes.length > 0;\n const allSettled = computes.length > 0 && settledCount === computes.length;\n const phase5Complete = status === \"COMPLETED\";\n\n const requestsJson = computes.map((item) => {\n const { _id: _ignored, ...rest } = item as ComputeDocument & { _id?: unknown };\n return rest;\n });\n\n return [\n {\n id: \"phase-1\",\n title: \"Phase 1: Contract Agreement\",\n status: agreement ? `RESPONSES (${agreement.responses?.length ?? 0})` : \"—\",\n description: \"Established once and reused by every compute request in this session.\",\n json: agreement\n ? {\n contractId: agreement.contractId,\n creator: agreement.creator,\n fee: agreement.fee,\n creationTime: agreement.creationTime,\n parties: agreement.parties,\n responses: agreement.responses,\n indexer: agreement.indexer,\n computeTx: agreement.computeTx,\n }\n : {},\n active: phase1Active,\n complete: phase1Complete,\n pending: phase1Active && !phase1Complete,\n },\n {\n id: \"phase-2\",\n title: \"Phase 2: Compute Request\",\n status: phase2Active ? `${computes.length} SUBMITTED` : \"PENDING\",\n description: \"Each iteration submits a compute request that is broadcast to all guardians.\",\n json: { requestCount: computes.length, requests: requestsJson },\n active: phase2Active,\n complete: phase2Active,\n pending: phase1Complete && !phase2Active,\n },\n {\n id: \"phase-3\",\n title: \"Phase 3: Guardian Execution\",\n status: allSettled\n ? `${settledCount}/${computes.length} RESULT_SUBMITTED`\n : phase2Active\n ? `${settledCount}/${computes.length} PROCESSING`\n : \"PENDING\",\n description: \"One guardian claims each request, executes compute, and submits the result on-chain.\",\n json: latest?.resultTx\n ? {\n jobId: latest.jobId,\n contractId: latest.contractId,\n orchestrator: latest.orchestrator,\n resultTx: latest.resultTx,\n settledCount,\n requestCount: computes.length,\n }\n : { settledCount, requestCount: computes.length },\n active: phase2Active,\n complete: allSettled,\n pending: phase2Active && !allSettled,\n },\n {\n id: \"phase-4\",\n title: \"Phase 4: Fee Distribution\",\n status: allSettled ? `${settledCount}/${computes.length} SETTLED` : phase2Active ? \"PROCESSING\" : \"PENDING\",\n description: \"Executor reward is paid per completed request. TD fee was locked once at agreement.\",\n json: allSettled\n ? {\n requestCount: computes.length,\n settledCount,\n computeReward: latest?.computeReward,\n decryptionFee: latest?.decryptionFee,\n fee: latest?.fee,\n }\n : { requestCount: computes.length, settledCount },\n active: allSettled,\n complete: allSettled,\n pending: phase2Active && !allSettled,\n },\n {\n id: \"phase-5\",\n title: \"Phase 5: Close Out\",\n status: phase5Complete ? \"SETTLED\" : phase1Complete ? \"PENDING\" : \"—\",\n description: \"User sends closeout, guardians clean up, remaining funds are refunded.\",\n json: {\n requestCount: computes.length,\n settledCount,\n finalStatus: phase5Complete ? \"SETTLED\" : status,\n },\n active: phase5Complete,\n complete: phase5Complete,\n pending: phase1Complete && !phase5Complete,\n },\n ];\n}\n\n/**\n * Fetch a compute contract, optional `/api/compute/:id` payload, and\n * `palliora-compute.results` rows, then derive session lifecycle status and\n * the five UI phases used by the explorer.\n *\n * Missing compute (`404`) or results (`404`) is treated as empty.\n */\nexport async function getContractFlow(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ContractFlow>> {\n const [agreementResponse, compute, results] = await Promise.all([\n getContract(client, id),\n getCompute(client, id).then((response) => response.data).catch((err) => {\n if (err instanceof IndexerHttpError && err.statusCode === 404) return null;\n throw err;\n }),\n getResults(client, { contractId: id }).then((response) => response.data).catch((err) => {\n if (err instanceof IndexerHttpError && err.statusCode === 404) return [];\n throw err;\n }),\n ]);\n\n const agreement = withParties(agreementResponse.data);\n const computes = mergeComputes(\n (results ?? []).map(resultToCompute),\n normalizeComputes(compute),\n );\n const latest = computes[computes.length - 1] ?? null;\n\n return {\n success: true,\n data: {\n agreement,\n compute: latest,\n computes,\n results: results ?? [],\n status: deriveContractStatus(agreement, computes) as ContractFlowStatus,\n phases: buildContractPhases(agreement, computes),\n },\n };\n}\n\nfunction blobHeightsFromArtefact(artefact: ArtefactDocument): number[] {\n const refs = artefact.blobRefs;\n if (!Array.isArray(refs)) return [];\n const heights: number[] = [];\n for (const ref of refs) {\n const raw = Array.isArray(ref) ? ref[0] : ref;\n const height = typeof raw === \"number\" ? raw : Number(raw);\n if (Number.isFinite(height)) heights.push(height);\n }\n return heights;\n}\n\n/**\n * Fetch an artefact together with its access records and blobs.\n *\n * Missing access (`404`) becomes `[]`. Missing blobs are skipped.\n */\nexport async function getArtefactFlow(\n client: IndexerClient,\n id: string,\n accessQuery?: ArtefactAccessQuery,\n): Promise<SuccessResponse<ArtefactFlow>> {\n const artefactResponse = await getArtefact(client, id);\n const artefact = artefactResponse.data;\n\n let access: unknown[] = [];\n try {\n const accessResponse = await getArtefactAccess(client, id, accessQuery);\n access = Array.isArray(accessResponse.data) ? accessResponse.data : [];\n } catch (err) {\n if (!(err instanceof IndexerHttpError && err.statusCode === 404)) throw err;\n }\n\n const blobs: BlobDocument[] = [];\n for (const height of blobHeightsFromArtefact(artefact)) {\n try {\n const blobResponse = await getBlob(client, height);\n if (blobResponse.data) blobs.push(blobResponse.data);\n } catch (err) {\n if (err instanceof IndexerHttpError && err.statusCode === 404) continue;\n throw err;\n }\n }\n\n return {\n success: true,\n data: { artefact, access, blobs },\n };\n}\n","import type { IndexerClient } from \"./client\";\nimport type { BlocksData, BlocksQuery, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a paginated list of blocks, including chain stats.\n *\n * `GET /api/blocks`\n *\n * Response shape: `{ success: true, data: { blocks: BlockDocument[], stats? } }`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size`\n */\nexport async function getBlocks(\n\tclient: IndexerClient,\n\tquery?: BlocksQuery,\n): Promise<SuccessResponse<BlocksData>> {\n\treturn client.get(\"/api/blocks\", query ? { ...query } : undefined);\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n CallDocument,\n CallQuery,\n CallMetadataDocument,\n CallMetadataQuery,\n CallArgsDocument,\n CallArgsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a call by block height and extrinsic index.\n *\n * `GET /api/call`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `blockHeight` and `extrinsicIndex`\n */\nexport async function getCall(\n client: IndexerClient,\n query: CallQuery,\n): Promise<SuccessResponse<CallDocument>> {\n return client.get(\"/api/call\", { ...query });\n}\n\n/**\n * Fetch call metadata by block height and extrinsic index.\n *\n * `GET /api/call-metadata`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `blockHeight` and `extrinsicIndex`\n */\nexport async function getCallMetadata(\n client: IndexerClient,\n query: CallMetadataQuery,\n): Promise<SuccessResponse<CallMetadataDocument>> {\n return client.get(\"/api/call-metadata\", { ...query });\n}\n\n/**\n * Fetch call arguments by metadata hash.\n *\n * `GET /api/call-args`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `metadataHash`\n */\nexport async function getCallArgs(\n client: IndexerClient,\n query: CallArgsQuery,\n): Promise<SuccessResponse<CallArgsDocument>> {\n return client.get(\"/api/call-args\", { ...query });\n}\n","import type { IndexerClient } from \"./client\";\nimport type { TransferDocument, TransfersQuery, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a paginated list of transfers, sorted by block height descending.\n *\n * `GET /api/transfers`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size`\n */\nexport async function getTransfers(\n client: IndexerClient,\n query?: TransfersQuery,\n): Promise<SuccessResponse<TransferDocument[]>> {\n return client.get(\"/api/transfers\", query ? { ...query } : undefined);\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n ExtrinsicDocument,\n ExtrinsicsQuery,\n PaginatedResponse,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a paginated list of extrinsics, sorted by block height descending.\n *\n * `GET /api/extrinsics`\n *\n * Fields `nonce`, `_id`, `tip`, and `signature` are excluded by the indexer.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed, default 0), `page_size` (default 10, max 100);\n * `signed_only: true` filters to signed extrinsics only\n * @returns `{ success: true, data: ExtrinsicDocument[], total: number }`\n */\nexport async function getExtrinsics(\n client: IndexerClient,\n query?: ExtrinsicsQuery,\n): Promise<PaginatedResponse<ExtrinsicDocument>> {\n if (!query) {\n return client.get(\"/api/extrinsics\");\n }\n\n const { signed_only, ...rest } = query;\n const params: Record<string, string | number | boolean | undefined> = { ...rest };\n\n if (signed_only !== undefined) {\n // Indexer expects the string \"true\" / \"false\"\n params.signed_only = signed_only === true || signed_only === \"true\" ? \"true\" : \"false\";\n }\n\n return client.get(\"/api/extrinsics\", params);\n}\n\n/**\n * Fetch a single extrinsic by block index or transaction hash.\n *\n * `GET /api/extrinsic/:indexOrHash`\n *\n * Accepts either:\n * - Block index: `blockHeight-extrinsicIndex` (e.g. `\"2528092-2\"`)\n * - Transaction hash: `0x`-prefixed 64-char hex string\n *\n * @param client Configured {@link IndexerClient}\n * @param indexOrHash Block-index pair or extrinsic hash\n * @throws {IndexerHttpError} `400` for invalid id format, `404` when not found\n */\nexport async function getExtrinsic(\n client: IndexerClient,\n indexOrHash: string,\n): Promise<SuccessResponse<ExtrinsicDocument>> {\n return client.get(`/api/extrinsic/${encodeURIComponent(indexOrHash)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { AddressDocument, DataOnlyResponse } from \"./types\";\n\n/**\n * Fetch the top 50 addresses by balance.\n *\n * `GET /api/addresses`\n *\n * **Note:** This endpoint returns a raw array, not a `{ success, data }` envelope.\n *\n * @param client Configured {@link IndexerClient}\n */\nexport async function getAddresses(\n client: IndexerClient,\n): Promise<AddressDocument[]> {\n return client.get(\"/api/addresses\");\n}\n\n/**\n * Fetch a single address document.\n *\n * `GET /api/address/:address`\n *\n * **Note:** This endpoint returns `{ data }` without a `success` field.\n *\n * @param client Configured {@link IndexerClient}\n * @param address The substrate address to look up\n */\nexport async function getAddress(\n client: IndexerClient,\n address: string,\n): Promise<DataOnlyResponse<AddressDocument>> {\n return client.get(`/api/address/${encodeURIComponent(address)}`);\n}\n","import { IndexerHttpError, type IndexerClient } from \"./client\";\nimport type {\n GuardianDocument,\n GuardianGroupDocument,\n GuardianGroupsQuery,\n SuccessResponse,\n} from \"./types\";\n\nfunction displayNameForAccount(\n groups: GuardianGroupDocument[],\n account: string,\n): string | null {\n for (const group of groups) {\n const addresses = group.guardians ?? [];\n const names = group.guardianNames ?? [];\n const index = addresses.indexOf(account);\n if (index === -1) continue;\n const rawName = names[index];\n if (typeof rawName === \"string\" && rawName.length > 0) return rawName;\n }\n return null;\n}\n\nfunction uniqueGuardians(groups: GuardianGroupDocument[]): GuardianDocument[] {\n const seen = new Map<string, string | null>();\n for (const group of groups) {\n const addresses = group.guardians ?? [];\n const names = group.guardianNames ?? [];\n for (let i = 0; i < addresses.length; i++) {\n const account = addresses[i];\n if (!account || seen.has(account)) continue;\n const rawName = names[i];\n seen.set(account, typeof rawName === \"string\" && rawName.length > 0 ? rawName : null);\n }\n }\n return Array.from(seen, ([account, displayName]) => ({ account, displayName }));\n}\n\nasync function guardianGroupsOrEmpty(\n client: IndexerClient,\n query?: GuardianGroupsQuery,\n): Promise<GuardianGroupDocument[]> {\n try {\n const response = await getGuardianGroups(client, query);\n return response.data ?? [];\n } catch (err) {\n if (err instanceof IndexerHttpError && err.statusCode === 404) {\n return [];\n }\n throw err;\n }\n}\n\n/**\n * Fetch guardian groups, optionally filtered by guardian address.\n * Results are deduplicated and enriched with identity names.\n *\n * `GET /api/guardian-groups`\n *\n * Each group includes `guardians: string[]` and a parallel `guardianNames`\n * array (`string | null`) from the identity database.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filter — `guardian` address\n */\nexport async function getGuardianGroups(\n client: IndexerClient,\n query?: GuardianGroupsQuery,\n): Promise<SuccessResponse<GuardianGroupDocument[]>> {\n return client.get(\"/api/guardian-groups\", query ? { ...query } : undefined);\n}\n\n/**\n * Flatten identity-enriched guardian groups into a unique list of guardians.\n *\n * Derived from {@link getGuardianGroups}; there is no separate `/api/guardians`\n * endpoint. A 404 (no groups) returns an empty list.\n *\n * @returns `{ success: true, data: GuardianDocument[] }`\n * where each item is `{ account, displayName }`.\n */\nexport async function getGuardians(\n client: IndexerClient,\n): Promise<SuccessResponse<GuardianDocument[]>> {\n const groups = await guardianGroupsOrEmpty(client);\n return { success: true, data: uniqueGuardians(groups) };\n}\n\n/**\n * Fetch identity for a single guardian account.\n *\n * Uses `GET /api/guardian-groups?guardian=<account>` and returns\n * `{ account, displayName }`. `displayName` is `null` when the account has\n * no identity or is not in any indexed group.\n */\nexport async function getGuardian(\n client: IndexerClient,\n account: string,\n): Promise<SuccessResponse<GuardianDocument>> {\n const groups = await guardianGroupsOrEmpty(client, { guardian: account });\n return {\n success: true,\n data: {\n account,\n displayName: displayNameForAccount(groups, account),\n },\n };\n}\n\n/**\n * Fetch a single guardian group by its group ID.\n *\n * `GET /api/guardian-group/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `groupId`\n */\nexport async function getGuardianGroup(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<GuardianGroupDocument>> {\n return client.get(`/api/guardian-group/${encodeURIComponent(id)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { AccessDocument, AccessQuery, AccessResponse } from \"./types\";\n\n/**\n * Fetch access records from the **legacy** statescan-polkadot-data database.\n *\n * `GET /api/access`\n *\n * > **Deprecated** — superseded by `getArtefactAccess`. Kept for backward compatibility.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getAccess(\n client: IndexerClient,\n query?: AccessQuery,\n): Promise<AccessResponse<AccessDocument>> {\n return client.get(\"/api/access\", query ? { ...query } : undefined);\n}\n","import { getApi, signAndSend } from \"./chain\";\nimport bs58 from 'bs58';\nimport { debugLog } from \"./utils/helper\";\nimport assert from \"assert\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getProvider } from \"./config\";\n\nexport async function rotateAndSetKeys(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`Rotating session keys for ${account.meta.name} on ${getProvider().endpoint}`);\n\n const newKeys = await api.rpc.author.rotateKeys();\n debugLog(`${account.meta.name} rotated keys on ${getProvider().endpoint}:`, newKeys?.toHex?.() ?? newKeys);\n\n const setKeysTx = api.tx.session.setKeys(newKeys, []);\n const hash = await signAndSend(setKeysTx, account);\n\n debugLog(`Rotate session transaction sent with hash: ${hash.hash}`);\n}\n\nexport async function setWorker(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n const peerid = bs58.decode((await api.rpc.system.localPeerId()).toString());\n const setWorkerTx = api.tx.guardian.setWorker(peerid.slice(6, 38));\n const hash = await signAndSend(setWorkerTx, account);\n\n debugLog(`Set worker id transaction sent with hash: ${hash.hash}`);\n}","export * from \"./account\";\nexport * from \"./chain\";\nexport * from \"./compute\";\nexport * from \"./costEstimation\";\nexport * from \"./crypto\";\nexport * from \"./da\";\nexport * from \"./guardian\";\nexport * from \"./stake\";\nexport * from \"./storage\";\nexport * from \"./token\";\nexport * from \"./utils/helper\";\nexport * from \"./utils/token\";\nexport * from \"./validator\";\nexport * from \"./config\";\nexport * from \"./identity\";\nexport * from \"./indexer\";\nexport * from \"./rotateKeys\";\n\nexport * from \"@polkadot/util\";\nexport * as utilCrypto from \"@polkadot/util-crypto\";\nexport * as wasmCrypto from \"@polkadot/wasm-crypto\";\nexport { ApiPromise, WsProvider, HttpProvider } from \"@polkadot/api\";\nexport { Keyring } from \"@polkadot/keyring\";\nexport type { KeyringPair } from \"@polkadot/keyring/types\";\n","export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';\nexport { Keyring } from './keyring.js';\nexport { packageInfo } from './packageInfo.js';\nexport { createPair } from './pair/index.js';\nexport { createTestKeyring } from './testing.js';\nexport { createTestPairs } from './testingPairs.js';\nexport * from './defaults.js';\n","import { hexToU8a, isHex, stringToU8a } from '@polkadot/util';\nimport { base64Decode, decodeAddress, ed25519PairFromSeed as ed25519FromSeed, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, secp256k1PairFromSeed as secp256k1FromSeed, sr25519PairFromSeed as sr25519FromSeed } from '@polkadot/util-crypto';\nimport { createPair } from './pair/index.js';\nimport { DEV_PHRASE } from './defaults.js';\nimport { Pairs } from './pairs.js';\nconst PairFromSeed = {\n ecdsa: (seed) => secp256k1FromSeed(seed),\n ed25519: (seed) => ed25519FromSeed(seed),\n ethereum: (seed) => secp256k1FromSeed(seed),\n sr25519: (seed) => sr25519FromSeed(seed)\n};\nfunction pairToPublic({ publicKey }) {\n return publicKey;\n}\n/**\n * # @polkadot/keyring\n *\n * ## Overview\n *\n * @name Keyring\n * @summary Keyring management of user accounts\n * @description Allows generation of keyring pairs from a variety of input combinations, such as\n * json object containing account address or public key, account metadata, and account encoded using\n * `addFromJson`, or by providing those values as arguments separately to `addFromAddress`,\n * or by providing the mnemonic (seed phrase) and account metadata as arguments to `addFromMnemonic`.\n * Stores the keyring pairs in a keyring pair dictionary. Removal of the keyring pairs from the keyring pair\n * dictionary is achieved using `removePair`. Retrieval of all the stored pairs via `getPairs` or perform\n * lookup of a pair for a given account address or public key using `getPair`. JSON metadata associated with\n * an account may be obtained using `toJson` accompanied by the account passphrase.\n */\nexport class Keyring {\n #pairs;\n #type;\n #ss58;\n decodeAddress = decodeAddress;\n constructor(options = {}) {\n options.type = options.type || 'ed25519';\n if (!['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined')) {\n throw new Error(`Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);\n }\n this.#pairs = new Pairs();\n this.#ss58 = options.ss58Format;\n this.#type = options.type;\n }\n /**\n * @description retrieve the pairs (alias for getPairs)\n */\n get pairs() {\n return this.getPairs();\n }\n /**\n * @description retrieve the publicKeys (alias for getPublicKeys)\n */\n get publicKeys() {\n return this.getPublicKeys();\n }\n /**\n * @description Returns the type of the keyring, ed25519, sr25519 or ecdsa\n */\n get type() {\n return this.#type;\n }\n /**\n * @name addPair\n * @summary Stores an account, given a keyring pair, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n */\n addPair(pair) {\n return this.#pairs.add(pair);\n }\n /**\n * @name addFromAddress\n * @summary Stores an account, given an account address, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to explicitly provide separate inputs including account address or public key, and optionally\n * the associated account metadata, and the default encoded value as arguments (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from them that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromAddress(address, meta = {}, encoded = null, type = this.type, ignoreChecksum, encType) {\n const publicKey = this.decodeAddress(address, ignoreChecksum);\n return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { publicKey, secretKey: new Uint8Array() }, meta, encoded, encType));\n }\n /**\n * @name addFromJson\n * @summary Stores an account, given JSON data, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to provide a json object argument that contains account information (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from it that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromJson(json, ignoreChecksum) {\n return this.addPair(this.createFromJson(json, ignoreChecksum));\n }\n /**\n * @name addFromMnemonic\n * @summary Stores an account, given a mnemonic, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to provide a mnemonic (seed phrase that is provided when account is originally created)\n * argument and a metadata argument that contains account information (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from it that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromMnemonic(mnemonic, meta = {}, type = this.type, wordlist) {\n return this.addFromUri(mnemonic, meta, type, wordlist);\n }\n /**\n * @name addFromPair\n * @summary Stores an account created from an explicit publicKey/secreteKey combination\n */\n addFromPair(pair, meta = {}, type = this.type) {\n return this.addPair(this.createFromPair(pair, meta, type));\n }\n /**\n * @name addFromSeed\n * @summary Stores an account, given seed data, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Stores in a keyring pair dictionary the public key of the pair as a key and the pair as the associated value.\n * Allows user to provide the account seed as an argument, and then generates a keyring pair from it that it passes to\n * `addPair` to store in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromSeed(seed, meta = {}, type = this.type) {\n return this.addPair(createPair({ toSS58: this.encodeAddress, type }, PairFromSeed[type](seed), meta, null));\n }\n /**\n * @name addFromUri\n * @summary Creates an account via an suri\n * @description Extracts the phrase, path and password from a SURI format for specifying secret keys `<secret>/<soft-key>//<hard-key>///<password>` (the `///password` may be omitted, and `/<soft-key>` and `//<hard-key>` maybe repeated and mixed). The secret can be a hex string, mnemonic phrase or a string (to be padded)\n */\n addFromUri(suri, meta = {}, type = this.type, wordlist) {\n return this.addPair(this.createFromUri(suri, meta, type, wordlist));\n }\n /**\n * @name createFromJson\n * @description Creates a pair from a JSON keyfile\n */\n createFromJson({ address, encoded, encoding: { content, type, version }, meta }, ignoreChecksum) {\n if (version === '3' && content[0] !== 'pkcs8') {\n throw new Error(`Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);\n }\n const cryptoType = version === '0' || !Array.isArray(content)\n ? this.type\n : content[1];\n const encType = !Array.isArray(type)\n ? [type]\n : type;\n if (!['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType)) {\n throw new Error(`Unknown crypto type ${cryptoType}`);\n }\n // Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs\n const publicKey = isHex(address)\n ? hexToU8a(address)\n : this.decodeAddress(address, ignoreChecksum);\n const decoded = isHex(encoded)\n ? hexToU8a(encoded)\n : base64Decode(encoded);\n return createPair({ toSS58: this.encodeAddress, type: cryptoType }, { publicKey, secretKey: new Uint8Array() }, meta, decoded, encType);\n }\n /**\n * @name createFromPair\n * @summary Creates a pair from an explicit publicKey/secreteKey combination\n */\n createFromPair(pair, meta = {}, type = this.type) {\n return createPair({ toSS58: this.encodeAddress, type }, pair, meta, null);\n }\n /**\n * @name createFromUri\n * @summary Creates a Keypair from an suri\n * @description This creates a pair from the suri, but does not add it to the keyring\n */\n createFromUri(_suri, meta = {}, type = this.type, wordlist) {\n // here we only aut-add the dev phrase if we have a hard-derived path\n const suri = _suri.startsWith('//')\n ? `${DEV_PHRASE}${_suri}`\n : _suri;\n const { derivePath, password, path, phrase } = keyExtractSuri(suri);\n let seed;\n const isPhraseHex = isHex(phrase, 256);\n if (isPhraseHex) {\n seed = hexToU8a(phrase);\n }\n else {\n const parts = phrase.split(' ');\n if ([12, 15, 18, 21, 24].includes(parts.length)) {\n seed = type === 'ethereum'\n ? mnemonicToLegacySeed(phrase, '', false, 64)\n : mnemonicToMiniSecret(phrase, password, wordlist);\n }\n else {\n if (phrase.length > 32) {\n throw new Error('specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');\n }\n seed = stringToU8a(phrase.padEnd(32));\n }\n }\n const derived = type === 'ethereum'\n ? isPhraseHex\n ? PairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once\n : hdEthereum(seed, derivePath.substring(1))\n : keyFromPath(PairFromSeed[type](seed), path, type);\n return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);\n }\n /**\n * @name encodeAddress\n * @description Encodes the input into an ss58 representation\n */\n encodeAddress = (address, ss58Format) => {\n return this.type === 'ethereum'\n ? ethereumEncode(address)\n : encodeAddress(address, ss58Format ?? this.#ss58);\n };\n /**\n * @name getPair\n * @summary Retrieves an account keyring pair from the Keyring Pair Dictionary, given an account address\n * @description Returns a keyring pair value from the keyring pair dictionary by performing\n * a key lookup using the provided account address or public key (after decoding it).\n */\n getPair(address) {\n return this.#pairs.get(address);\n }\n /**\n * @name getPairs\n * @summary Retrieves all account keyring pairs from the Keyring Pair Dictionary\n * @description Returns an array list of all the keyring pair values that are stored in the keyring pair dictionary.\n */\n getPairs() {\n return this.#pairs.all();\n }\n /**\n * @name getPublicKeys\n * @summary Retrieves Public Keys of all Keyring Pairs stored in the Keyring Pair Dictionary\n * @description Returns an array list of all the public keys associated with each of the keyring pair values that are stored in the keyring pair dictionary.\n */\n getPublicKeys() {\n return this.#pairs.all().map(pairToPublic);\n }\n /**\n * @name removePair\n * @description Deletes the provided input address or public key from the stored Keyring Pair Dictionary.\n */\n removePair(address) {\n this.#pairs.remove(address);\n }\n /**\n * @name setSS58Format;\n * @description Sets the ss58 format for the keyring\n */\n setSS58Format(ss58) {\n this.#ss58 = ss58;\n }\n /**\n * @name toJson\n * @summary Returns a JSON object associated with the input argument that contains metadata assocated with an account\n * @description Returns a JSON object containing the metadata associated with an account\n * when valid address or public key and when the account passphrase is provided if the account secret\n * is not already unlocked and available in memory. Note that in [Polkadot-JS Apps](https://github.com/polkadot-js/apps) the user\n * may backup their account to a JSON file that contains this information.\n */\n toJson(address, passphrase) {\n return this.#pairs.get(address).toJson(passphrase);\n }\n}\n","import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';\nimport { blake2AsU8a, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';\nimport { decodePair } from './decode.js';\nimport { encodePair } from './encode.js';\nimport { pairToJson } from './toJson.js';\nconst SIG_TYPE_NONE = new Uint8Array();\nconst TYPE_FROM_SEED = {\n ecdsa: secp256k1FromSeed,\n ed25519: ed25519FromSeed,\n ethereum: secp256k1FromSeed,\n sr25519: sr25519FromSeed\n};\nconst TYPE_PREFIX = {\n ecdsa: new Uint8Array([2]),\n ed25519: new Uint8Array([0]),\n ethereum: new Uint8Array([2]),\n sr25519: new Uint8Array([1])\n};\nconst TYPE_SIGNATURE = {\n ecdsa: (m, p) => secp256k1Sign(m, p, 'blake2'),\n ed25519: ed25519Sign,\n ethereum: (m, p) => secp256k1Sign(m, p, 'keccak'),\n sr25519: sr25519Sign\n};\nconst TYPE_ADDRESS = {\n ecdsa: (p) => p.length > 32 ? blake2AsU8a(p) : p,\n ed25519: (p) => p,\n ethereum: (p) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),\n sr25519: (p) => p\n};\nfunction isLocked(secretKey) {\n return !secretKey || u8aEmpty(secretKey);\n}\nfunction vrfHash(proof, context, extra) {\n return blake2AsU8a(u8aConcat(context || '', extra || '', proof));\n}\n/**\n * @name createPair\n * @summary Creates a keyring pair object\n * @description Creates a keyring pair object with provided account public key, metadata, and encoded arguments.\n * The keyring pair stores the account state including the encoded address and associated metadata.\n *\n * It has properties whose values are functions that may be called to perform account actions:\n *\n * - `address` function retrieves the address associated with the account.\n * - `decodedPkcs8` function is called with the account passphrase and account encoded public key.\n * It decodes the encoded public key using the passphrase provided to obtain the decoded account public key\n * and associated secret key that are then available in memory, and changes the account address stored in the\n * state of the pair to correspond to the address of the decoded public key.\n * - `encodePkcs8` function when provided with the correct passphrase associated with the account pair\n * and when the secret key is in memory (when the account pair is not locked) it returns an encoded\n * public key of the account.\n * - `meta` is the metadata that is stored in the state of the pair, either when it was originally\n * created or set via `setMeta`.\n * - `publicKey` returns the public key stored in memory for the pair.\n * - `sign` may be used to return a signature by signing a provided message with the secret\n * key (if it is in memory) using Nacl.\n * - `toJson` calls another `toJson` function and provides the state of the pair,\n * it generates arguments to be passed to the other `toJson` function including an encoded public key of the account\n * that it generates using the secret key from memory (if it has been made available in memory)\n * and the optionally provided passphrase argument. It passes a third boolean argument to `toJson`\n * indicating whether the public key has been encoded or not (if a passphrase argument was provided then it is encoded).\n * The `toJson` function that it calls returns a JSON object with properties including the `address`\n * and `meta` that are assigned with the values stored in the corresponding state variables of the account pair,\n * an `encoded` property that is assigned with the encoded public key in hex format, and an `encoding`\n * property that indicates whether the public key value of the `encoded` property is encoded or not.\n */\nexport function createPair({ toSS58, type }, { publicKey, secretKey }, meta = {}, encoded = null, encTypes) {\n const decodePkcs8 = (passphrase, userEncoded) => {\n const decoded = decodePair(passphrase, userEncoded || encoded, encTypes);\n if (decoded.secretKey.length === 64) {\n publicKey = decoded.publicKey;\n secretKey = decoded.secretKey;\n }\n else {\n const pair = TYPE_FROM_SEED[type](decoded.secretKey);\n publicKey = pair.publicKey;\n secretKey = pair.secretKey;\n }\n };\n const recode = (passphrase) => {\n isLocked(secretKey) && encoded && decodePkcs8(passphrase, encoded);\n encoded = encodePair({ publicKey, secretKey }, passphrase); // re-encode, latest version\n encTypes = undefined; // swap to defaults, latest version follows\n return encoded;\n };\n const encodeAddress = () => {\n const raw = TYPE_ADDRESS[type](publicKey);\n return type === 'ethereum'\n ? ethereumEncode(raw)\n : toSS58(raw);\n };\n return {\n get address() {\n return encodeAddress();\n },\n get addressRaw() {\n const raw = TYPE_ADDRESS[type](publicKey);\n return type === 'ethereum'\n ? raw.slice(-20)\n : raw;\n },\n get isLocked() {\n return isLocked(secretKey);\n },\n get meta() {\n return meta;\n },\n get publicKey() {\n return publicKey;\n },\n get type() {\n return type;\n },\n // eslint-disable-next-line sort-keys\n decodePkcs8,\n derive: (suri, meta) => {\n if (type === 'ethereum') {\n throw new Error('Unable to derive on this keypair');\n }\n else if (isLocked(secretKey)) {\n throw new Error('Cannot derive on a locked keypair');\n }\n const { path } = keyExtractPath(suri);\n const derived = keyFromPath({ publicKey, secretKey }, path, type);\n return createPair({ toSS58, type }, derived, meta, null);\n },\n encodePkcs8: (passphrase) => {\n return recode(passphrase);\n },\n lock: () => {\n secretKey = new Uint8Array();\n },\n setMeta: (additional) => {\n meta = objectSpread({}, meta, additional);\n },\n sign: (message, options = {}) => {\n if (isLocked(secretKey)) {\n throw new Error('Cannot sign with a locked key pair');\n }\n return u8aConcat(options.withType\n ? TYPE_PREFIX[type]\n : SIG_TYPE_NONE, TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey }));\n },\n toJson: (passphrase) => {\n // NOTE: For ecdsa and ethereum, the publicKey cannot be extracted from the address. For these\n // pass the hex-encoded publicKey through to the address portion of the JSON (before decoding)\n // unless the publicKey is already an address\n const address = ['ecdsa', 'ethereum'].includes(type)\n ? publicKey.length === 20\n ? u8aToHex(publicKey)\n : u8aToHex(secp256k1Compress(publicKey))\n : encodeAddress();\n return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);\n },\n unlock: (passphrase) => {\n return decodePkcs8(passphrase);\n },\n verify: (message, signature, signerPublic) => {\n return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;\n },\n vrfSign: (message, context, extra) => {\n if (isLocked(secretKey)) {\n throw new Error('Cannot sign with a locked key pair');\n }\n if (type === 'sr25519') {\n return sr25519VrfSign(message, { secretKey }, context, extra);\n }\n const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });\n return u8aConcat(vrfHash(proof, context, extra), proof);\n },\n vrfVerify: (message, vrfResult, signerPublic, context, extra) => {\n if (type === 'sr25519') {\n return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);\n }\n const result = signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](u8aToU8a(signerPublic)));\n return result.isValid && u8aEq(vrfResult.subarray(0, 32), vrfHash(vrfResult.subarray(32), context, extra));\n }\n };\n}\n","import { u8aEq } from '@polkadot/util';\nimport { jsonDecryptData } from '@polkadot/util-crypto';\nimport { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';\nconst SEED_OFFSET = PAIR_HDR.length;\n/**\n * Decode a pair, taking into account the generation-specific formats and headers\n *\n * For divisor/headers, don't rely on the magic being static. These will\n * change between generations, aka with the long-awaited 4th generation\n * of the format. The external decode interface is the only way to use and decode these.\n **/\nexport function decodePair(passphrase, encrypted, _encType) {\n const encType = Array.isArray(_encType) || _encType === undefined\n ? _encType\n : [_encType];\n const decrypted = jsonDecryptData(encrypted, passphrase, encType);\n const header = decrypted.subarray(0, PAIR_HDR.length);\n // check the start header (generations 1-3)\n if (!u8aEq(header, PAIR_HDR)) {\n throw new Error('Invalid encoding header found in body');\n }\n // setup for generation 3 format\n let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);\n let divOffset = SEED_OFFSET + SEC_LENGTH;\n let divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);\n // old-style (generation 1 & 2), we have the seed here\n if (!u8aEq(divider, PAIR_DIV)) {\n divOffset = SEED_OFFSET + SEED_LENGTH;\n secretKey = decrypted.subarray(SEED_OFFSET, divOffset);\n divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);\n // check the divisior at this point (already checked for generation 3)\n if (!u8aEq(divider, PAIR_DIV)) {\n throw new Error('Invalid encoding divider found in body');\n }\n }\n const pubOffset = divOffset + PAIR_DIV.length;\n const publicKey = decrypted.subarray(pubOffset, pubOffset + PUB_LENGTH);\n return {\n publicKey,\n secretKey\n };\n}\n","/** public/secret section divider (generation 1-3, will change in 4, don't rely on value) */\nexport const PAIR_DIV = new Uint8Array([161, 35, 3, 33, 0]);\n/** public/secret start block (generation 1-3, will change in 4, don't rely on value) */\nexport const PAIR_HDR = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);\n/** length of a public key */\nexport const PUB_LENGTH = 32;\n/** length of a salt */\nexport const SALT_LENGTH = 32;\n/** length of a secret key */\nexport const SEC_LENGTH = 64;\n/** length of a user-input seed */\nexport const SEED_LENGTH = 32;\n","import { u8aConcat } from '@polkadot/util';\nimport { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';\nimport { PAIR_DIV, PAIR_HDR } from './defaults.js';\n/**\n * Encode a pair with the latest generation format (generation 3)\n **/\nexport function encodePair({ publicKey, secretKey }, passphrase) {\n if (!secretKey) {\n throw new Error('Expected a valid secretKey to be passed to encode');\n }\n const encoded = u8aConcat(PAIR_HDR, secretKey, PAIR_DIV, publicKey);\n if (!passphrase) {\n return encoded;\n }\n // this is only for generation 3 (previous generations are only handled in decoding)\n const { params, password, salt } = scryptEncode(passphrase);\n const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));\n return u8aConcat(scryptToU8a(salt, params), nonce, encrypted);\n}\n","import { objectSpread } from '@polkadot/util';\nimport { jsonEncryptFormat } from '@polkadot/util-crypto';\nexport function pairToJson(type, { address, meta }, encoded, isEncrypted) {\n return objectSpread(jsonEncryptFormat(encoded, ['pkcs8', type], isEncrypted), {\n address,\n meta\n });\n}\n","export const DEV_PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';\nexport const DEV_SEED = '0xfac7959dbfe72f052e5a0c3c8d6530f202b02fd8f9f5ca3580ec8deb7797479e';\n","import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';\nimport { decodeAddress } from '@polkadot/util-crypto';\nexport class Pairs {\n #map = {};\n add(pair) {\n this.#map[decodeAddress(pair.address).toString()] = pair;\n return pair;\n }\n all() {\n return Object.values(this.#map);\n }\n get(address) {\n const pair = this.#map[decodeAddress(address).toString()];\n if (!pair) {\n throw new Error(`Unable to retrieve keypair '${isU8a(address) || isHex(address)\n ? u8aToHex(u8aToU8a(address))\n : address}'`);\n }\n return pair;\n }\n remove(address) {\n delete this.#map[decodeAddress(address).toString()];\n }\n}\n"],"mappings":"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","names":["CryptoType","AccountSourceType","keyring","encrypt","Keyring","waitReady","waitReady","Keyring","isFunction","waitReady","api","waitReady","api","block","ext","api","request","api","isFunction","getBlock","api","getFileMetadataCall","request","encrypt","waitReady","waitReady","api","api","api","api","keyring","api","edwardsToMontgomeryPub","api","encrypt","edwardsToMontgomeryPub","bs58","api","bs58","path","u8aToHex","u8aToHex","api","request","api","request","api","encrypt","request","api","api","api","api","api","api","api","keyring","api","api","api","assert","api","assert","path","bs58","assert","api","assert","bs58","ApiPromise","WsProvider","decodeAddress","encodeAddress","hexToU8a","isHex","decodeAddress","ed25519FromSeed","ethereumEncode","keyFromPath","secp256k1FromSeed","sr25519FromSeed","objectSpread","u8aConcat","u8aEq","u8aToHex","u8aConcat","encodeAddress","meta","path","objectSpread","u8aToHex","u8aEq","u8aToHex","u8aToU8a","u8aToHex","u8aToU8a","secp256k1FromSeed","ed25519FromSeed","sr25519FromSeed","Keyring","decodeAddress","ethereumEncode","isHex","hexToU8a","path","keyFromPath"]}
1
+ {"version":3,"sources":["../src/account/account.ts","../src/account/types.ts","../src/chain/spec.ts","../src/crypto/core.ts","../src/crypto/cipher.ts","../src/utils/assert.ts","../src/config.ts","../src/utils/helper.ts","../src/utils/token.ts","../src/chain/singleton.ts","../src/chain/utils.ts","../src/guardian/active.ts","../src/guardian/group.ts","../src/guardian/join.ts","../src/chain/onchainfs.ts","../src/chain/blocks.ts","../src/token/balance.ts","../src/account/info.ts","../src/compute/agreement.ts","../src/compute/data.ts","../src/compute/fees.ts","../src/compute/encryptedInference.ts","../src/crypto/random.ts","../src/compute/inference.ts","../src/compute/participants.ts","../src/compute/simple.ts","../src/compute/stored.ts","../src/costEstimation/client.ts","../src/costEstimation/estimate.ts","../src/costEstimation/auction.ts","../src/costEstimation/webhook.ts","../src/costEstimation/health.ts","../src/da/register.ts","../src/da/runAgent.ts","../src/da/submit.ts","../src/da/upload.ts","../src/stake/add.ts","../src/stake/idle.ts","../src/stake/new.ts","../src/stake/payout.ts","../src/stake/reduce.ts","../src/stake/remove.ts","../src/stake/withdraw.ts","../src/storage/s3.ts","../src/storage/router.ts","../src/token/fund.ts","../src/token/transfer.ts","../src/validator/join.ts","../src/identity.ts","../src/indexer/client.ts","../src/indexer/artefacts.ts","../src/indexer/contracts.ts","../src/indexer/blobs.ts","../src/indexer/flow.ts","../src/indexer/blocks.ts","../src/indexer/overview.ts","../src/indexer/events.ts","../src/indexer/calls.ts","../src/indexer/transfers.ts","../src/indexer/extrinsics.ts","../src/indexer/addresses.ts","../src/indexer/guardians.ts","../src/indexer/access.ts","../src/rotateKeys.ts","../src/index.ts","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/bundle.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/keyring.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/index.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/decode.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/defaults.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/encode.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pair/toJson.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/defaults.js","../node_modules/.pnpm/@polkadot+keyring@13.5.9_@polkadot+util-crypto@13.5.9_@polkadot+util@13.5.9__@polkadot+util@13.5.9/node_modules/@polkadot/keyring/pairs.js"],"sourcesContent":["import { waitReady } from \"@polkadot/wasm-crypto\";\nimport { AccountSourceType, CryptoType } from \"./types\";\nimport { Keyring } from \"@polkadot/api\";\nimport { hexToU8a } from \"@polkadot/util\";\nimport { ed25519PairFromSecret, secp256k1PairFromSeed } from \"@polkadot/util-crypto\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { keccak256 } from \"viem\";\nimport { poseidon1, poseidon2 } from \"poseidon-lite\";\n\n/**\n * Creates a Substrate account from a private key, seed, or mnemonic.\n * @param input - The input string (private key hex, seed hex, or mnemonic phrase).\n * @param type - The type of input: 'privateKey', 'seed', or 'mnemonic'.\n * @param cryptoType - The crypto type: 'sr25519' | 'ed25519' | 'ecdsa' (default: 'sr25519').\n * @returns The keypair object.\n */\nexport async function createAccount(\n input: string,\n type: AccountSourceType,\n name: string = \"default\",\n cryptoType: CryptoType = CryptoType.SR25519,\n signedMsg: string = \"sign\",\n): Promise<KeyringPair> {\n await waitReady();\n const keyring = new Keyring({ type: cryptoType });\n\n switch (type) {\n case AccountSourceType.PRIVATE_KEY: {\n const pair = pairFromPrivateKeyHex(input, cryptoType);\n return keyring.addFromPair(pair, { name }, cryptoType);\n }\n case AccountSourceType.SEED: {\n const seed = hexToU8a(input);\n\n if (seed.length !== 32) {\n throw new Error(\n `Invalid ${cryptoType} seed length. Expected 32 bytes, got ${seed.length}`\n );\n }\n\n return keyring.addFromSeed(seed, { name }, cryptoType);\n }\n case AccountSourceType.MNEMONIC:\n // format: <mnemonic or mini-secret>[//hard-derivation][/soft-derivation][///password]\n // refer docs: https://polkadot.js.org/docs/keyring/start/suri/\n return keyring.createFromUri(input, { name }, cryptoType);\n case AccountSourceType.ADDRESS:\n const account = keyring.addFromAddress(\n input,\n { name },\n null,\n cryptoType\n );\n return account;\n case AccountSourceType.DERIVED:\n if (!input.startsWith(\"0x\")) {\n throw new Error(\"Invalid signature format for derived account. Expected hex string starting with 0x.\");\n }\n const signKeyBytes = sigToSeed(signedMsg, input as `0x${string}`);\n return createAccount(signKeyBytes, AccountSourceType.SEED, name, cryptoType);\n default:\n throw new Error(\"Invalid input type\");\n }\n}\n\n/**\n * Derives a Substrate account from a Magic Link (or other Ethereum-compatible)\n * signature over the fixed message `createAccount` expects for signature-derived\n * accounts, wiring passwordless/email-based onboarding into the existing\n * `AccountSourceType.DERIVED` flow.\n *\n * @param signature - Hex-encoded signature (0x-prefixed) produced by the Magic Link signer.\n */\nexport async function createAccountFromMagicLink(\n signature: string,\n name: string = \"default\",\n cryptoType: CryptoType = CryptoType.SR25519,\n): Promise<KeyringPair> {\n return createAccount(signature, AccountSourceType.DERIVED, name, cryptoType);\n}\n\nexport function pairFromPrivateKeyHex(privateKeyHex: string, cryptoType: CryptoType) {\n const privateKey = hexToU8a(privateKeyHex);\n\n switch (cryptoType) {\n case CryptoType.ED25519:\n if (privateKey.length !== 64) {\n throw new Error(\n `Invalid ed25519 private key length. Expected 64 bytes, got ${privateKey.length}`\n );\n }\n return ed25519PairFromSecret(privateKey);\n case CryptoType.ECDSA:\n if (privateKey.length !== 32) {\n throw new Error(\n `Invalid ecdsa private key length. Expected 32 bytes, got ${privateKey.length}`\n );\n }\n return secp256k1PairFromSeed(privateKey);\n case CryptoType.SR25519:\n if (privateKey.length !== 96) {\n throw new Error(\n `Invalid sr25519 private key length. Expected 96 bytes (secret+public), got ${privateKey.length}`\n );\n }\n return {\n secretKey: privateKey.slice(0, 64),\n publicKey: privateKey.slice(64, 96),\n };\n default:\n throw new Error(`Unsupported crypto type: ${cryptoType}`);\n }\n}\n\nfunction sigToSeed(msg: string, sign: `0x${string}`) {\n const seed = BigInt(keccak256(sign));\n const encoder = new TextEncoder();\n\n const signBytes = encoder.encode(msg);\n const signHex = Array.from(signBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const SALT_SIGN = poseidon1([BigInt(`0x${signHex}`)]);\n\n // Convert to 32 bytes (64 hex characters)\n const signKeyBytes = poseidon2([seed.toString(), SALT_SIGN])\n .toString(16)\n .slice(0, 64); // Ensure exactly 64 hex characters (32 bytes)\n\n return signKeyBytes;\n}\n","enum CryptoType {\n SR25519 = \"sr25519\",\n ED25519 = \"ed25519\",\n ECDSA = \"ecdsa\",\n}\n\nenum AccountSourceType {\n PRIVATE_KEY = \"privateKey\",\n SEED = \"seed\",\n MNEMONIC = \"mnemonic\",\n DERIVED = \"derived\",\n ADDRESS = \"address\",\n}\n\nexport { CryptoType, AccountSourceType };\n","\nexport const API_RPC = {\n\tkate: {\n\t\tqueryRows: {\n\t\t\tdescription: \"\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"rows\",\n\t\t\t\t\ttype: \"Vec<u32>\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"Vec<GRow>\",\n\t\t},\n\t\tqueryProof: {\n\t\t\tdescription: \"Generate the kate proof for the given `cells`\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"cells\",\n\t\t\t\t\ttype: \"Vec<Cell>\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"Vec<GDataProof>\",\n\t\t},\n\t\tblockLength: {\n\t\t\tdescription: \"Get Block Length\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"BlockLength\",\n\t\t},\n\t\tqueryDataProof: {\n\t\t\tdescription: \"Generate the data proof for the given `transaction_index`\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: \"transaction_index\",\n\t\t\t\t\ttype: \"u32\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"at\",\n\t\t\t\t\ttype: \"Hash\",\n\t\t\t\t\tisOptional: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\ttype: \"ProofResponse\",\n\t\t},\n\t},\n\tguardian: {\n\t\truntimeInfo: {\n\t\t\tdescription: \"Fetch guardian runtime info\",\n\t\t\tparams: [\n\t\t\t\t{\n\t\t\t\t\tname: 'at',\n\t\t\t\t\ttype: 'Hash',\n\t\t\t\t\tisOptional: true\n\t\t\t\t}\n\t\t\t],\n\t\t\ttype: 'GuardianInfo'\n\t\t},\n\t\tguardianList: {\n\t\t\tdescription: \"Fetch guardian list\",\n\t\t\tparams: [],\n\t\t\ttype: 'Vec<String>'\n\t\t},\n\t\tguardianNwParams: {\n\t\t\tdescription: \"Fetch guardian network parameters\",\n\t\t\tparams: [],\n\t\t\ttype: 'GuardianNwParams'\n\t\t}\n\t},\n};\n\nexport const API_TYPES = {\n\tGuardianInfo: {\n\t\tactive: 'u32',\n\t\tmaximum: 'u32'\n\t},\n\tCurrencyId: {\n\t\t_enum: {\n\t\t\tNative: 'Null',\n\t\t\tUSDC: 'Null',\n\t\t\tForeignAsset: 'u32',\n\t\t},\n\t},\n\tGuardianNwParams: {\n\t\tkzg: 'Vec<u8>',\n\t\taggKey: 'Vec<u8>'\n\t},\n\tAppId: \"Compact<u32>\",\n\tDataLookupItem: {\n\t\tappId: \"AppId\",\n\t\tstart: \"Compact<u32>\",\n\t},\n\tCompactDataLookup: {\n\t\tsize: \"Compact<u32>\",\n\t\tindex: \"Vec<DataLookupItem>\",\n\t},\n\tKateCommitment: {\n\t\trows: \"Compact<u16>\",\n\t\tcols: \"Compact<u16>\",\n\t\tcommitment: \"Vec<u8>\",\n\t\tdataRoot: \"H256\",\n\t},\n\tV3HeaderExtension: {\n\t\tappLookup: \"CompactDataLookup\",\n\t\tcommitment: \"KateCommitment\",\n\t},\n\tHeaderExtension: {\n\t\t_enum: {\n\t\t\tV1: null,\n\t\t\tV2: null,\n\t\t\tV3: \"V3HeaderExtension\",\n\t\t},\n\t},\n\tDaHeader: {\n\t\tparentHash: \"Hash\",\n\t\tnumber: \"Compact<BlockNumber>\",\n\t\tstateRoot: \"Hash\",\n\t\textrinsicsRoot: \"Hash\",\n\t\tdigest: \"Digest\",\n\t\textension: \"HeaderExtension\",\n\t},\n\tHeader: \"DaHeader\",\n\tCheckAppIdExtra: {\n\t\tappId: \"AppId\",\n\t},\n\tCheckAppIdTypes: {},\n\tCheckAppId: {\n\t\textra: \"CheckAppIdExtra\",\n\t\ttypes: \"CheckAppIdTypes\",\n\t},\n\tFeePayload: {\n\t\tcompute: \"u128\",\n\t\tguardian: \"u128\",\n\t\tverifier: \"u128\",\n\t},\n\tSilentThresholdParams: {\n\t\ttdParams: 'Vec<u8>',\n\t\tpkBytes: 'Vec<u8>',\n\t\ttauParams: 'Vec<u8>'\n\t},\n\tThresholdParams: {\n\t\t_enum: {\n\t\tSilentThreshold: 'SilentThresholdParams'\n\t\t}\n\t},\n\tChaCha20Poly1305Params: {\n\t\tnonce: '[u8; 12]'\n\t},\n\tAes256GcmParams: {\n\t\tnonce: '[u8; 12]'\n\t},\n\tSymmetricParams: {\n\t\t_enum: {\n\t\tChaCha20Poly1305: 'ChaCha20Poly1305Params',\n\t\tAes256Gcm: 'Aes256GcmParams'\n\t\t}\n\t},\n\tKdfParams: {\n\t\t_enum: {\n\t\tHkdfSha256: 'Null',\n\t\tHkdfSha512: 'Null'\n\t\t}\n\t},\n\tSecp256k1Params: {\n\t\trecipientPublicKey: 'Vec<u8>',\n\t\tephemeralPublicKey: 'Option<Vec<u8>>',\n\t\tcompressed: 'bool',\n\t\tkdf: 'KdfParams',\n\t\tsalt: 'Option<Vec<u8>>',\n\t\tinfo: 'Option<Vec<u8>>'\n\t},\n\tEd25519Params: {\n\t\trecipientPublicKey: 'Vec<u8>',\n\t\tephemeralPublicKey: 'Option<Vec<u8>>',\n\t\tkdf: 'KdfParams',\n\t\tsalt: 'Option<Vec<u8>>',\n\t\tinfo: 'Option<Vec<u8>>'\n\t},\n\tAsymmetricParams: {\n\t\t_enum: {\n\t\tSecp256k1: 'Secp256k1Params',\n\t\tEd25519: 'Ed25519Params'\n\t\t}\n\t},\n\tThresholdHybridParams: {\n\t\tthresholdParams: 'ThresholdParams',\n\t\tsymmetricParams: 'SymmetricParams'\n\t},\n\tAsymmetricHybridParams: {\n\t\tasymmetricParams: 'AsymmetricParams',\n\t\tsymmetricParams: 'SymmetricParams'\n\t},\n\tCipherSuite: {\n\t\t_enum: {\n\t\tPlaintext: 'Null',\n\t\tThresholdHybrid: 'ThresholdHybridParams',\n\t\tAsymmetricHybrid: 'AsymmetricHybridParams'\n\t\t}\n\t},\n\tConfidentialityLevel: {\n\t\t_enum: {\n\t\tTrusted: 'u32',\n\t\tTEE: 'Null',\n\t\tFHE: 'Null',\n\t\tSMPC: 'Null'\n\t\t}\n\t},\n\tNativeExecuteDA: {\n\t\t_enum: ['Inference', 'ContractAccess']\n\t},\n\tNativeDataDA: {\n\t\t_enum: ['DaFalse', 'DaTrue']\n\t},\n\tDAInputInline: {\n\t\tdata: 'Vec<u8>'\n\t},\n\tDAInputChainTransaction: {\n\t\tblockNumber: 'u64',\n\t\textrinsicIndex: 'u32'\n\t},\n\tDAInputContractId: {\n\t\tid: '[u8; 32]'\n\t},\n\tDAInputIpfs: {\n\t\tcid: 'Vec<u8>',\n\t\tsize: 'u64'\n\t},\n\tDAInputUrl: {\n\t\turl: 'Vec<u8>',\n\t\tsize: 'u64',\n\t\thash: 'Option<Vec<u8>>'\n\t},\n\tDAInput: {\n\t\t_enum: {\n\t\tNull: 'Null',\n\t\tInline: 'DAInputInline',\n\t\tChainTransaction: 'DAInputChainTransaction',\n\t\tContractId: 'DAInputContractId',\n\t\tIpfs: 'DAInputIpfs',\n\t\tUrl: 'DAInputUrl',\n\t\tNativeExecute: 'NativeExecuteDA',\n\t\tNativeData: 'NativeDataDA'\n\t\t}\n\t},\n\tContractType: {\n\t\t_enum: {\n\t\tDormant: 'Null',\n\t\tActive: 'Null',\n\t\tSubscription: 'Null',\n\t\t}\n\t},\n\tStoreType: {\n\t\t_enum: {\n\t\tDataset: 'Null', // 0\n\t\tModel: 'Null', // 1\n\t\tAgent: 'Null', // 2\n\t\tExecutable: 'Null', // 3\n\t\tOther: 'Null', // 4\n\t\t}\n\t},\n\tComputeMetadata: {\n\t\tname: 'Vec<u8>',\n\t\tdescription: 'Vec<u8>',\n\t\tstoreType: 'StoreType',\n\t\tgroupId: 'H256',\n\t},\n\tComputeInfo: {\n\t\tcipher: 'CipherSuite',\n\t\tcomputerIndices: 'Vec<u32>',\n\t\tfees: 'u128',\n\t\tcomputeRate: 'u128',\n\t\tdeadline: 'u64',\n\t\tconfidentiality: 'ConfidentialityLevel',\n\t\tfeeFunction: 'Option<u8>',\n\t\tprogramEnv: 'Option<Vec<u8>>',\n\t\tinput: 'DAInput',\n\t\tprogram: 'DAInput',\n\t\tmetadata: 'Option<ComputeMetadata>',\n\t},\n\tContract: {\n\t\tcontractType: 'ContractType',\n\t\tguardians: 'Vec<AccountId>',\n\t\tpreCheck: 'Option<ComputeInfo>',\n\t\tcompute: 'ComputeInfo',\n\t\tpostCheck: 'Option<ComputeInfo>',\n\t\tresultCipher: 'CipherSuite',\n\t\tcurrencyId: 'CurrencyId'\n\t},\n\tAgreementInfo: {\n\t\tstatus: 'AgreementStatus',\n\t\tcreator: 'AccountId',\n\t\tindex: 'u32'\n\t},\n ComputePayload: {\n\t\tdaType: \"u8\",\n\t\tagreement: \"Option<BoundedVec<[u8; 32], 10>>\",\n\t\tverification: \"u8\",\n\t\tcompute: \"u8\",\n },\n\tComputePrefs: {\n\t\ttrusted: \"bool\",\n\t\ttee: \"bool\",\n\t\tmpc: \"bool\",\n\t\tfhe: \"bool\",\n\t\tzkp: \"bool\",\n\t},\n\tComputeType: {\n\t\t_enum: [\"Trusted\", \"Tee\", \"Mpc\", \"Fhe\", \"Zkp\"],\n\t},\n\tGuardianPrefs: {\n\t\tpubKey: \"[u8; 32]\",\n\t\tguardian: \"bool\",\n\t\tverifier: \"bool\",\n\t\tcompute: \"bool\",\n\t\tcomputePrefs: \"Option<ComputePrefs>\",\n\t\tfeeThresholds: \"Vec<(ComputeType, u128)>\",\n\t},\n\tBlockLengthColumns: \"Compact<u32>\",\n\tBlockLengthRows: \"Compact<u32>\",\n\tBlockLength: {\n\t\tmax: \"PerDispatchClass\",\n\t\tcols: \"BlockLengthColumns\",\n\t\trows: \"BlockLengthRows\",\n\t\tchunkSize: \"Compact<u32>\",\n\t},\n\tPerDispatchClass: {\n\t\tnormal: \"u32\",\n\t\toperational: \"u32\",\n\t\tmandatory: \"u32\",\n\t},\n\tTxDataRoots: {\n\t\tdataRoot: \"H256\",\n\t\tblobRoot: \"H256\",\n\t\tbridgeRoot: \"H256\",\n\t},\n\tDataProof: {\n\t\troots: \"TxDataRoots\",\n\t\tproof: \"Vec<H256>\",\n\t\tnumberOfLeaves: \"Compact<u32>\",\n\t\tleafIndex: \"Compact<u32>\",\n\t\tleaf: \"H256\",\n\t},\n\tProofResponse: {\n\t\tdataProof: \"DataProof\",\n\t\tmessage: \"Option<AddressedMessage>\",\n\t},\n\tAddressedMessage: {\n\t\tmessage: \"Message\",\n\t\tfrom: \"H256\",\n\t\tto: \"H256\",\n\t\toriginDomain: \"u32\",\n\t\tdestinationDomain: \"u32\",\n\t\tid: \"u64\",\n\t},\n\tMessage: {\n\t\t_enum: {\n\t\t\tArbitraryMessage: \"ArbitraryMessage\",\n\t\t\tFungibleToken: \"FungibleToken\",\n\t\t},\n\t},\n\tFungibleToken: {\n\t\tassetId: \"H256\",\n\t\tamount: \"u128\",\n\t},\n\tBoundedData: \"Vec<u8>\",\n\tArbitraryMessage: \"BoundedData\",\n\tCell: {\n\t\trow: \"u32\",\n\t\tcol: \"u32\",\n\t},\n\tGRawScalar: \"U256\",\n\tGProof: \"[u8; 48]\",\n\tGRow: \"Vec<GRawScalar>\",\n\tGDataProof: \"(GRawScalar, GProof)\",\n\tAgreementStatus: {\n\t\t_enum: ['NotFound', 'Pending', 'Accepted', 'Rejected', 'Settled']\n\t},\n\tAcceptedSubStatus: {\n\t\t_enum: ['Running', 'AwaitingTopUp', 'TopUpReceived', 'RejectedInsufficientBudget', 'RejectedRateMismatch']\n\t},\n\tRejectedSubStatus: {\n\t\t_enum: ['InsufficientBudget', 'RateMismatch']\n\t},\n\tSettlementReason: {\n\t\t_enum: ['ResultReceived', 'DeadlineReached', 'BudgetExhausted']\n\t},\n\tExecutionOutcome: {\n\t\t_enum: ['FullSettlement', 'PartialSettlement', 'Success', 'Failed', 'Terminated', 'TopUpTimeout']\n\t},\n\tContractInfo: {\n\t\tstatus: 'AgreementStatus',\n\t\towner: 'AccountId',\n\t\toriginBlock: 'u32',\n\t\tinvocationBlock: 'u32',\n\t\tindex: 'u32',\n\t\tusagePrice: 'u128',\n\t\tcontractType: 'ContractType',\n\t},\n\tSettlementInfo: {\n\t\tcomputeRate: 'u128',\n\t\tinputContractId: 'Option<[u8; 32]>',\n\t\tguardians: 'Vec<AccountId>',\n\t},\n\tAppKeyInfo: {\n\t\towner: 'AccountId',\n\t\tid: 'AppId',\n\t},\n\tDataType: {\n\t\t_enum: ['Dataset', 'Model', 'Agent']\n\t},\n};\n\nexport const DEFAULT_COMPUTE_PAYLOAD = { compute: { daType: 0, verification: 0, compute: 0 } };\nexport const DEFAULT_EMPTY_PAYLOAD = { compute: { daType: 0, verification: 0, compute: 0, agreement: [] } };\n\nexport const API_EXTENSIONS = {\n\tCheckAppId: {\n\t\textrinsic: {\n\t\t\tappId: \"AppId\",\n\t\t},\n\t\tpayload: {},\n\t},\n\tCheckCompute: {\n\t\textrinsic: {\n\t\t\t\tcompute: \"ComputePayload\",\n\t\t},\n\t\tpayload: {},\n\t},\n\t// Replaces pallet_transaction_payment::ChargeTransactionPayment. Since this\n\t// identifier isn't one @polkadot/api knows natively, this definition entirely\n\t// replaces (not merges with) the built-in one, so `tip` must be re-declared\n\t// here alongside the new `currencyId` field or it silently drops from the\n\t// encoded extra bytes, shifting every extrinsic out of alignment.\n\tChargeCurrencyTransactionPayment: {\n\t\textrinsic: {\n\t\t\ttip: \"Compact<Balance>\",\n\t\t\tcurrencyId: \"Option<CurrencyId>\",\n\t\t},\n\t\tpayload: {},\n\t},\n};\n","// import { CurveType } from '@noble/curves/abstract/bls';\nimport { bls12_381 as bls } from \"@noble/curves/bls12-381\";\nimport type { ProjPointType } from \"@noble/curves/abstract/weierstrass\";\nimport type { Fp, Fp12, Fp2 } from \"@noble/curves/abstract/tower\";\n\n/**\n * Summary of porting the Silent Threshold encryption scheme from Rust to JavaScript.\n *\n * The Silent Threshold encryption scheme is a threshold encryption scheme that uses BLS12-381 as the underlying elliptic curve.\n * The scheme is based on the BLS signature scheme and uses the BLS pairing to encrypt and decrypt data.\n *\n * The types ported from the original Rust implementation are:\n * - E::ScalarField -> BigInt\n * - QuadExtField -> Fp2\n * - CubicExtField -> Fp6\n * - E::G1 -> ProjPointType<Fp>\n * - E::G2 -> ProjPointType<Fp2>\n * - PairingOutput -> ProjPointType<Fp12>\n */\n\n/**\n * @typedef {Object} PublicKey\n * @property {number} id - The identifier for the public key.\n * @property {ProjPointType<Fp>} bls_pk - The BLS public key.\n * @property {ProjPointType<Fp>} sk_li - The secret key component li.\n * @property {ProjPointType<Fp>} sk_li_minus0 - The secret key component li minus 0.\n * @property {ProjPointType<Fp>} sk_li_x - The secret key component li x.\n * @property {Array<ProjPointType<Fp>>} sk_li_lj_z - The secret key components li lj z.\n */\ntype PublicKey = {\n\tid: number;\n\tbls_pk: ProjPointType<Fp>;\n\tsk_li: ProjPointType<Fp>; //hint\n\tsk_li_minus0: ProjPointType<Fp>; //hint\n\tsk_li_lj_z: Array<ProjPointType<Fp>>; //hint\n\tsk_li_x: ProjPointType<Fp>; //hint\n};\n\n/**\n * @typedef {Object} LagrangePowers\n * @property {Array<CurveType>} li - The Lagrange coefficients li.\n * @property {Array<ProjPointType<Fp>>} li_minus0 - The Lagrange coefficients li minus 0.\n * @property {Array<ProjPointType<Fp>>} li_x - The Lagrange coefficients li x.\n * @property {Array<Array<ProjPointType<Fp>>>} li_lj_z - The Lagrange coefficients li lj z.\n */\ntype LagrangePowers = {\n\t// li: Array<CurveType>,\n\tli_minus0: Array<ProjPointType<Fp>>;\n\tli_x: Array<ProjPointType<Fp>>;\n\tli_lj_z: Array<Array<ProjPointType<Fp>>>;\n};\n\n/**\n * @typedef {ProjPointType<Fp12>} PairingOutput - The output of the pairing operation.\n */\ntype PairingOutput = ProjPointType<Fp12>;\n\n/**\n * @typedef {Object} AggregateKey\n * @property {Array<PublicKey>} pk - The array of public keys.\n * @property {Array<ProjPointType<Fp>>} agg_sk_li_lj_z - The aggregated secret key components li lj z.\n * @property {ProjPointType<Fp>} ask - The aggregated secret key.\n * @property {ProjPointType<Fp2>} z_g2 - The z_g2 component.\n * @property {ProjPointType<Fp2>} h_minus1 - The h_minus1 component.\n * @property {PairingOutput} e_gh - The preprocessed pairing output.\n */\ntype AggregateKey = {\n\tpk: Array<PublicKey>;\n\tagg_sk_li_lj_z: Array<ProjPointType<Fp>>;\n\task: ProjPointType<Fp>;\n\tz_g2: ProjPointType<Fp2>;\n\n\t//preprocessed values\n\th_minus1: ProjPointType<Fp2>;\n\te_gh: Fp12;\n};\n\n/**\n * @typedef {Object} Ciphertext\n * @property {ProjPointType<Fp2>} gamma_g2 - The gamma_g2 component.\n * @property {Array<ProjPointType<Fp>>} sa1 - The sa1 components (2 elements).\n * @property {Array<ProjPointType<Fp2>>} sa2 - The sa2 components (6 elements).\n * @property {PairingOutput} enc_key - The encryption key.\n * @property {number} t - The threshold value.\n */\ntype Ciphertext = {\n\tgamma_g2: ProjPointType<Fp2>;\n\tsa1: ProjPointType<Fp>[];\n\tsa2: ProjPointType<Fp2>[];\n\tenc_key: Fp12; // key to be used for encapsulation\n\tt: number; // threshold\n};\n\n/**\n * @typedef {Object} PowersOfTau\n * @property {ArrayLike<ProjPointType<Fp>>} powers_of_g - The powers of g.\n * @property {ArrayLike<ProjPointType<Fp2>>} powers_of_h - The powers of h.\n */\ntype PowersOfTau = {\n\tpowers_of_g: ArrayLike<ProjPointType<Fp>>;\n\tpowers_of_h: ArrayLike<ProjPointType<Fp2>>;\n};\n\n/**\n * Encrypts data using the provided parameters and aggregate public key.\n *\n * @param params - The PowersOfTau parameters containing powers of g and h.\n * @param apk - The AggregateKey containing the aggregated public key and preprocessed values.\n * @param t - The threshold value for encryption.\n * @returns A Ciphertext object containing the encrypted data.\n */\nconst encrypt = (params: PowersOfTau, apk: AggregateKey, t: number) => {\n\t// Initialize an ArrayBuffer (tau) from a fixed string\n\tconst gamma = bls.fields.Fr.create(\n\t\tBigInt(\n\t\t\t\"0x\" +\n\t\t\treverseEndianess(\n\t\t\t\t\"8660d3c2a2ab458dd6da04d3e7cb5cf6edb702dfa2fa0c952cd6f3bcdc0fdb1a\",\n\t\t\t),\n\t\t),\n\t);\n\t// console.log(gamma.toString(16));\n\t// const gamma = bls.G1.normPrivateKeyToScalar(bls.utils.randomPrivateKey());\n\tconst gamma_g2 = params.powers_of_h[0].multiply(gamma);\n\t// console.log(gamma_g2.toHex(true));\n\n\tlet g = params.powers_of_g[0];\n\tlet h = params.powers_of_h[0];\n\n\tlet sa1 = [bls.G1.ProjectivePoint.BASE, bls.G1.ProjectivePoint.BASE];\n\tlet sa2: ProjPointType<Fp2>[] = Array(6).fill(bls.G2.ProjectivePoint.BASE);\n\t// sa1.forEach((value, index) => {\n\t// console.log(`sa1[${index}]: ${value.toHex(true)}`);\n\t// });\n\t// sa2.forEach((value, index) => {\n\t// console.log(`sa2[${index}]: ${value.toHex(true)}`);\n\t// });\n\n\tconst hexValues = [\n\t\treverseEndianess(\n\t\t\t\"08ca6f2a35f8f6f9cad58e9d764d450af154c246fc04266151e2a5493ff02943\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"8696a66087578b92e1b4b11c6b4c06d4694a9bed1f9468f0115e7f2648eb021d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"91e201cc83dc03cc47d63cfb8a9016e73ffd1a78fffd14e4dfcdf2cbb9a7245d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"a90598c6e0f25c3a104fc94632b1d58cf21bca3bbd7e41da07feb9c14e0fa60d\",\n\t\t),\n\t\treverseEndianess(\n\t\t\t\"d3f5a9fc8abfef02fb6095c08ba4f3445b36f0fb963579bc5112d34a02044567\",\n\t\t),\n\t];\n\n\t// let s = hexValues.map((hex) => bls.G1.normPrivateKeyToScalar(hex));\n\t// s.forEach((value, index) => {\n\t// console.log(`s[${index}]: ${value.toString(16)}`);\n\t// });\n\tconst s = Array.from({ length: 5 }, () => bls.G1.normPrivateKeyToScalar(bls.utils.randomPrivateKey()));\n\n\t// sa1[0] = s0*ask + s3*g^{tau^t} + s4*g\n\tsa1[0] = apk.ask\n\t\t.multiply(s[0])\n\t\t.add(params.powers_of_g[t].multiply(s[3]))\n\t\t.add(params.powers_of_g[0].multiply(s[4]));\n\n\t// sa1[1] = s2*g\n\tsa1[1] = g.multiply(s[2]);\n\n\t// sa2[0] = s0*h + s2*gamma_g2\n\tsa2[0] = h.multiply(s[0]).add(gamma_g2.multiply(s[2]));\n\n\t// sa2[1] = s0*z_g2\n\tsa2[1] = apk.z_g2.multiply(s[0]);\n\n\t// sa2[2] = s0*h^tau + s1*h^tau\n\tsa2[2] = params.powers_of_h[1]\n\t\t.multiply(s[0])\n\t\t.add(params.powers_of_h[1].multiply(s[1]));\n\n\t// sa2[3] = s1*h\n\tsa2[3] = h.multiply(s[1]);\n\n\t// sa2[4] = s3*h\n\tsa2[4] = h.multiply(s[3]);\n\n\t// sa2[5] = s4*h^{tau - omega^0}\n\tsa2[5] = params.powers_of_h[1].add(apk.h_minus1).multiply(s[4]);\n\n\t// enc_key = s4*e_gh\n\tconst enc_key = bls.fields.Fp12.pow(apk.e_gh, s[4]);\n\t// const enc_key = apk.e_gh.multiply(s[4]);\n\n\treturn { gamma_g2, sa1, sa2, enc_key, t };\n};\n\n/**\n * Decodes a hex string into a PowersOfTau object.\n *\n * @param input - The hex string to decode.\n * @returns A PowersOfTau object containing the decoded data.\n */\nconst decodePowersOfTau = (input: string): PowersOfTau => {\n\ttry {\n\t\t// Ensure input is properly formatted\n\t\tif (!input || input.length % 2 !== 0) {\n\t\t\tthrow new Error('Invalid input hex string');\n\t\t}\n\n\t\t// Convert hex string to Uint8Array\n\t\tconst hexArray = input.match(/.{1,2}/g) || [];\n\t\tconst buffer = new Uint8Array(hexArray.map(byte => parseInt(byte, 16)));\n\n\t\t// Create ArrayBuffer with the correct size\n\t\tconst arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n\t\tconst view = new DataView(arrayBuffer);\n\n\t\tconst powers_of_g: Array<ProjPointType<Fp>> = [];\n\t\tconst powers_of_h: Array<ProjPointType<Fp2>> = [];\n\n\t\tconst G1_POINT_SIZE = 48; // 96/2 bytes for G1 points\n\t\tconst G2_POINT_SIZE = 96; // 192/2 bytes for G2 points\n\n\t\tlet offset = 0;\n\n\t\t// Read count safely\n\t\tif (offset + 8 > buffer.length) {\n\t\t\tthrow new Error('Buffer too small to read count');\n\t\t}\n\t\tconst count = view.getBigUint64(offset, true);\n\t\toffset += 8;\n\n\t\t// Read powers_of_g\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tif (offset + G1_POINT_SIZE > buffer.length) {\n\t\t\t\tthrow new Error('Buffer too small to read G1 point');\n\t\t\t}\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + G1_POINT_SIZE);\n\t\t\tconst point = bls.G1.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpowers_of_g.push(point);\n\t\t\toffset += G1_POINT_SIZE;\n\t\t}\n\n\t\t// Skip the second count\n\t\tif (offset + 8 > buffer.length) {\n\t\t\tthrow new Error('Buffer too small to read second count');\n\t\t}\n\t\toffset += 8;\n\n\t\t// Read powers_of_h\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tif (offset + G2_POINT_SIZE > buffer.length) {\n\t\t\t\tthrow new Error('Buffer too small to read G2 point');\n\t\t\t}\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + G2_POINT_SIZE);\n\t\t\tconst point = bls.G2.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpowers_of_h.push(point);\n\t\t\toffset += G2_POINT_SIZE;\n\t\t}\n\n\t\treturn { powers_of_g, powers_of_h };\n\t} catch (error) {\n\t\tconsole.error('Error in decodePowersOfTau:', error);\n\t\tconsole.log('Input length:', input.length);\n\t\tconsole.log('Input preview:', input.slice(0, 100));\n\t\tthrow error;\n\t}\n};\n\n// Helper function to check if a hex string is valid\nconst isValidHex = (hex: string): boolean => {\n\treturn /^[0-9A-Fa-f]*$/.test(hex) && hex.length % 2 === 0;\n};\n\n// Helper function to safely create a DataView from a hex string\nconst createDataViewFromHex = (hex: string): { view: DataView, buffer: Uint8Array } => {\n\tif (!isValidHex(hex)) {\n\t\tthrow new Error('Invalid hex string');\n\t}\n\tconst buffer = new Uint8Array(hex.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)));\n\tconst arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n\treturn {\n\t\tview: new DataView(arrayBuffer),\n\t\tbuffer\n\t};\n};\n\n/**\n * Decodes a hex string into an AggregateKey object.\n *\n * @param input - The hex string to decode.\n * @returns An AggregateKey object containing the decoded data.\n */\nconst decodeAggregateKey = (input: string): AggregateKey => {\n\tconst buffer = new Uint8Array(input.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\tlet offset = 0;\n\n\tconst view = new DataView(buffer.buffer);\n\tconst readBigUInt64LE = () => {\n\t\tconst value = view.getBigUint64(offset, true);\n\t\toffset += 8;\n\t\treturn value;\n\t};\n\n\tconst readProjPointTypeFp = (count: bigint) => {\n\t\tconst points: Array<ProjPointType<Fp>> = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 48);\n\t\t\tconst point = bls.G1.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpoints.push(point);\n\t\t\toffset += 48;\n\t\t}\n\t\treturn points;\n\t};\n\n\tconst readProjPointTypeFp2 = (count: bigint) => {\n\t\tconst points: Array<ProjPointType<Fp2>> = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 96);\n\t\t\tconst point = bls.G2.ProjectivePoint.fromHex(pointBuffer);\n\t\t\tpoints.push(point);\n\t\t\toffset += 96;\n\t\t}\n\t\treturn points;\n\t};\n\n\tconst readProjPointTypeFp12 = () => {\n\t\tconst points: Array<Fp> = [];\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst pointBuffer = buffer.slice(offset, offset + 48);\n\t\t\t// Convert to hex and reverse for endianness\n\t\t\tconst hexValue = Array.from(pointBuffer)\n\t\t\t\t.reverse()\n\t\t\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t\t\t.join('');\n\t\t\tconst point = BigInt(\"0x\" + hexValue);\n\t\t\tpoints.push(point);\n\t\t\toffset += 48;\n\t\t}\n\t\tif (points.length !== 12) {\n\t\t\tthrow new Error(\"Invalid number of points for Fp12\");\n\t\t}\n\t\treturn bls.fields.Fp12.create({\n\t\t\tc0: bls.fields.Fp6.create({\n\t\t\t\tc0: bls.fields.Fp2.create({ c0: points[0], c1: points[1] }),\n\t\t\t\tc1: bls.fields.Fp2.create({ c0: points[2], c1: points[3] }),\n\t\t\t\tc2: bls.fields.Fp2.create({ c0: points[4], c1: points[5] }),\n\t\t\t}),\n\t\t\tc1: bls.fields.Fp6.create({\n\t\t\t\tc0: bls.fields.Fp2.create({ c0: points[6], c1: points[7] }),\n\t\t\t\tc1: bls.fields.Fp2.create({ c0: points[8], c1: points[9] }),\n\t\t\t\tc2: bls.fields.Fp2.create({ c0: points[10], c1: points[11] }),\n\t\t\t}),\n\t\t});\n\t};\n\n\tconst pkCount = readBigUInt64LE();\n\tconst pk: Array<PublicKey> = [];\n\tfor (let i = 0; i < pkCount; i++) {\n\t\tconst id = Number(readBigUInt64LE());\n\t\tconst bls_pk = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li_minus0 = readProjPointTypeFp(BigInt(1))[0];\n\t\tconst sk_li_lj_z = readProjPointTypeFp(readBigUInt64LE());\n\t\tconst sk_li_x = readProjPointTypeFp(BigInt(1))[0];\n\t\tpk.push({ id, bls_pk, sk_li, sk_li_minus0, sk_li_x, sk_li_lj_z });\n\t}\n\n\tconst agg_sk_li_lj_z = readProjPointTypeFp(readBigUInt64LE());\n\tconst ask = readProjPointTypeFp(BigInt(1))[0];\n\tconst z_g2 = readProjPointTypeFp2(BigInt(1))[0];\n\tconst h_minus1 = readProjPointTypeFp2(BigInt(1))[0];\n\tconst e_gh = readProjPointTypeFp12();\n\n\treturn { pk, agg_sk_li_lj_z, ask, z_g2, h_minus1, e_gh };\n};\n\n/**\n * Encode a Ciphertext object into a hex string.\n *\n * @param input - The Ciphertext object to encode.\n * @returns A hex string containing the encoded data.\n */\nconst encodeCiphertext = (input: Ciphertext): string => {\n\tconst writeProjPointTypeFp = (point: ProjPointType<Fp>) => {\n\t\tconst hex = point.toHex(true);\n\t\treturn new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\t};\n\n\tconst writeProjPointTypeFp2 = (point: ProjPointType<Fp2>) => {\n\t\tconst hex = point.toHex(true);\n\t\treturn new Uint8Array(hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\t};\n\n\tconst gamma_g2Buffer = writeProjPointTypeFp2(input.gamma_g2);\n\tconst sa1Buffer = new Uint8Array(input.sa1.flatMap(p => Array.from(writeProjPointTypeFp(p))));\n\tconst sa2Buffer = new Uint8Array(input.sa2.flatMap(p => Array.from(writeProjPointTypeFp2(p))));\n\tconst enc_keyBuffer = new Uint8Array(fp12ToHex(input.enc_key).match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) || []);\n\n\tconst tBuffer = new Uint8Array(8);\n\tnew DataView(tBuffer.buffer).setBigUint64(0, BigInt(input.t), true);\n\n\tconst totalLength = gamma_g2Buffer.length + sa1Buffer.length + sa2Buffer.length + enc_keyBuffer.length + tBuffer.length;\n\tconst resultBuffer = new Uint8Array(totalLength);\n\n\tlet offset = 0;\n\tresultBuffer.set(gamma_g2Buffer, offset);\n\toffset += gamma_g2Buffer.length;\n\tresultBuffer.set(sa1Buffer, offset);\n\toffset += sa1Buffer.length;\n\tresultBuffer.set(sa2Buffer, offset);\n\toffset += sa2Buffer.length;\n\tresultBuffer.set(enc_keyBuffer, offset);\n\toffset += enc_keyBuffer.length;\n\tresultBuffer.set(tBuffer, offset);\n\n\treturn Array.from(resultBuffer)\n\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n};\n\nfunction demoFieldOperations() {\n\t// Create base points in G1 and G2\n\tconst g1Base = bls.G1.ProjectivePoint.BASE;\n\tconst g2Base = bls.G2.ProjectivePoint.BASE;\n\tconsole.log(\"G1 generator: \", g1Base.toHex(true));\n\tconsole.log(\"G2 generator: \", g2Base.toHex(true));\n\n\tconst scalar = bls.fields.Fr.create(\n\t\tBigInt(\n\t\t\t\"0x1d8a77a2bc0faf4c4c904eed119108ed9b375265f7d06cec6862a2a97c3adb27\",\n\t\t),\n\t);\n\tconsole.log(\"Scalar: \", scalar.toString(16));\n\n\tconst e_ghH = bls.pairing(g1Base, g2Base);\n\tconsole.log(fp12ToHex(e_ghH));\n\t// return\n\n\t// Perform G1 addition\n\tconst g1Sum = g1Base.add(g1Base);\n\tconsole.log(\"G1 generator doubled: \", g1Sum.toHex(true));\n\n\t// Perform G2 addition\n\tconst g2Sum = g2Base.add(g2Base);\n\tconsole.log(\"G2 generator doubled: \", g2Sum.toHex(true));\n\n\t// Create an Fp element and do multiplication\n\tconst fp_a = bls.fields.Fp.create(\n\t\tBigInt(\n\t\t\t\"0xa191b705ef18a6e4e5bd4cc56de0b8f94b1f3c908f3e3fcbd4d1dc12eb85059be7e7d801edc1856c8cfbe6d63a681c1f\",\n\t\t),\n\t);\n\tconst fp_b = bls.fields.Fp.create(\n\t\tBigInt(\n\t\t\t\"0x8e07730c0dceb35342bfa587940babad2ec7622aec96994179086a5d323c479e64c890939e47f9a46b427f063f71d4f4\",\n\t\t),\n\t);\n\tconst fpModified = bls.fields.Fp.addN(fp_a, fp_b);\n\tconsole.log(\"Fp a + b: \", fpModified.toString(16));\n\n\tconst g1_a = bls.G1.ProjectivePoint.fromHex(\n\t\t\"a191b705ef18a6e4e5bd4cc56de0b8f94b1f3c908f3e3fcbd4d1dc12eb85059be7e7d801edc1856c8cfbe6d63a681c1f\",\n\t);\n\tconst g1_b = bls.G1.ProjectivePoint.fromHex(\n\t\t\"8e07730c0dceb35342bfa587940babad2ec7622aec96994179086a5d323c479e64c890939e47f9a46b427f063f71d4f4\",\n\t);\n\tconst g1_zero = bls.G1.ProjectivePoint.ZERO;\n\tconsole.log(\"G1 a: \", g1_a.toHex(true));\n\tconsole.log(\"G1 b: \", g1_b.toHex(true));\n\tconsole.log(\"G1 zero: \", g1_zero.toHex(true));\n\n\tconst g1_sum = g1_a.add(g1_b);\n\tconst g1_sub = g1_a.subtract(g1_b);\n\tconst g1_neg = g1_a.negate();\n\tconst g1_dbl = g1_a.double();\n\tconst g1_scalar_mul = g1_a.multiply(scalar);\n\tconsole.log(\"G1 a + b: \", g1_sum.toHex(true));\n\tconsole.log(\"G1 a - b: \", g1_sub.toHex(true));\n\tconsole.log(\"G1 -a: \", g1_neg.toHex(true));\n\tconsole.log(\"G1 2a: \", g1_dbl.toHex(true));\n\tconsole.log(\"G1 scalar mul: \", g1_scalar_mul.toHex(true));\n\n\t// Create an Fp2 element and do multiplication\n\tconst fp2_a = bls.fields.Fp2.create({\n\t\tc0: BigInt(\n\t\t\t\"0x848e9f7ae435bd738c33ae1f11cefb472b29a090de5ce00740b8ec1bd30fdbb27eb7e65162eed68c55e0bb03bf749857\",\n\t\t),\n\t\tc1: BigInt(\n\t\t\t\"0x0f8faa02f0dd3225ca98d8306f8efa4e3f62a13efc342f3466d3e56be5144dae68cafab0f99ddf1f04a6659806b12235\",\n\t\t),\n\t});\n\tconst fp2_b = bls.fields.Fp2.create({\n\t\tc0: BigInt(\n\t\t\t\"0xa4d21fc0921dcca8f0666f3b7530b569c2309bc13d3303a6fc3d233c58275972879c415608b6774bbbb00e10a6e47ace\",\n\t\t),\n\t\tc1: BigInt(\n\t\t\t\"0x1046aa2e6208f5d1813de823e5e3dec638bb7b82247cebeebbc70a14f1f59b9c0738b0f08120cb81d8c876579bd2391f\",\n\t\t),\n\t});\n\tconst fp2Modified = bls.fields.Fp2.addN(fp2_a, fp2_b);\n\tconsole.log(\n\t\t\"Fp2 a + b: \",\n\t\tfp2Modified.c0.toString(16),\n\t\tfp2Modified.c1.toString(16),\n\t);\n\n\tconst g2_a = bls.G2.ProjectivePoint.fromHex(\n\t\t\"848e9f7ae435bd738c33ae1f11cefb472b29a090de5ce00740b8ec1bd30fdbb27eb7e65162eed68c55e0bb03bf7498570f8faa02f0dd3225ca98d8306f8efa4e3f62a13efc342f3466d3e56be5144dae68cafab0f99ddf1f04a6659806b12235\",\n\t);\n\tconst g2_b = bls.G2.ProjectivePoint.fromHex(\n\t\t\"a4d21fc0921dcca8f0666f3b7530b569c2309bc13d3303a6fc3d233c58275972879c415608b6774bbbb00e10a6e47ace1046aa2e6208f5d1813de823e5e3dec638bb7b82247cebeebbc70a14f1f59b9c0738b0f08120cb81d8c876579bd2391f\",\n\t);\n\tconst g2_zero = bls.G2.ProjectivePoint.ZERO;\n\tconsole.log(\"G2 a: \", g2_a.toHex(true));\n\tconsole.log(\"G2 b: \", g2_b.toHex(true));\n\tconsole.log(\"G2 zero: \", g2_zero.toHex(true));\n\n\tconst g2_sum = g2_a.add(g2_b);\n\tconst g2_sub = g2_a.subtract(g2_b);\n\tconst g2_neg = g2_a.negate();\n\tconst g2_dbl = g2_a.double();\n\tconst g2_scalar_mul = g2_a.multiply(scalar);\n\tconsole.log(\"G2 a + b: \", g2_sum.toHex(true));\n\tconsole.log(\"G2 a - b: \", g2_sub.toHex(true));\n\tconsole.log(\"G2 -a: \", g2_neg.toHex(true));\n\tconsole.log(\"G2 2a: \", g2_dbl.toHex(true));\n\tconsole.log(\"G2 scalar mul: \", g2_scalar_mul.toHex(true));\n\n\t// Create an Fp12 element and do squaring\n\tconst fp12_a = hexToFp12(\n\t\t\"7b41018107fbe009aeb2ae912921bb2145b658bff588daea81a2d53a8c4aee171935fcc96fb395398ae4e4b20d937e16967f5e6a543f14a6751a869bfd22c8d96857389065eb86aa6784483efafc422ddb530f3dd76b3ce620605f6e21ee8c13f0a6b6f84a6ab78fdc1167e447c4f3a1d7cc51cf686646b7b31199d3e453c009ca949eb79696bf3d64c68a92e66fcc1514605dea849d01626006d806aca856a641993f84d2c620e6c97f4d8773c7664baee35761c576f687d6a643c3c6257b07f1f07ec6b0eb29ebaa9cb4088b29db25d2612fa604c96b3d148f0f8a954a0777b6e21f4b51f69530401651d1d0c9480ff23d5c0c0d34ede48be9c08dd6bbee77015deddac23d10eebd64ff1ecbce86a696f051fabe6c26e15e3b946afcc2b613f0b3a2126b6533792284bc5fc90a899c4c3a05b2491ce6903a9b2d85f30d630f421324492cbbbaf174cdc1a29adc110bb4891940fa9e8ad79520296819a6b6a32a578f7283c44d9c45e0c2676e0bbb4522cbdc23baebfa3cb008f43700a67207d7eb10a9d82cc576cbe3e10bac5e23613d456c18a512180869f48b52117c8dd1de9ce4728737d3239cfe829ccea8740e42c737ff961d5cff8d9ca0da3434ed909a3d362411cdb5c8e1bc917913c3cd783c3974621309d255f81c06e46132e0076209171b0ffea3ed0541e03d78856c018912927c520c56af071062972d1cb07276d8dcea9746000dbca97f78060e1815d22f5f88652aa53ae1664e449457c2e700e65efdaff38ac0a7849f4966411153dfd1befa7bab0d1889cc643e82809911\",\n\t);\n\tconst fp12_b = hexToFp12(\n\t\t\"d9b0619e9e724685d2eb06d509523870f9dfe07c7d7fb623632fc8f3ef8acd66fd9ed31a79af676ac1c2adc48ff018066f12bda4c5b225652d002ccba86315d57ebf098d35f3987a0b79f4d989c09c0c6373e58ac42c24e5a3b16d3eafa3e91020f0bfea83f3f1736732e71aac76e40399ec881a62a93426306be1e9dfc6645f1649a1d26d7d1ada5aca07c57551250749995a15db818c0aa7acb4606e7f41b65375308abbd547f7b8d90f10e1a7bfba60924a451108c8b896efa7355e14af10c096bb64e70e0c055e27e79b3b7552aa0b36bd3eace4759e13a31eabaea322bf978d2815b287e7c4d31281c85898090b57af368ceefe8be408504a0d57c542ad8e73f44211df17c89a2fd099f25895615828c884d9c31e514819d63856841601cce68807457db323e23db4bbc9a80900fb19aafd655069700db1b5d5a5753adedab2bd556fdc1774a54f0733a51e3c18f16e700f87ade824f35dde86023a5b7d816031e0eac3c4d82a80637a777969815fbd3ddcfcaf77ed7d9ad7c8c886530414d76c34808efefd57b488b065319f573a4ac806eb5da273c4320301ca6de6c682cd844f0a08c9b5e86f29431c32830d1feedf4d8bcd5d5ca90ef15084fffb98abe683d36e9de474ed069e8f72f4cdc7043cd38cb59878acef0674d0b48b8f0b9a0df326c8c7e97a5f35dcc1377f2e68d2e6076afb792db5ad38cb01158571e0c8b644e77c8d1b574653dcd73941070cd34deac7afe916952d3b67b4ad3e8993b33308c282de58e37afb28ae2afbb44f8e56b2e3ef575b67c5bc3112ccfedd07\",\n\t);\n\tconst fp12_zero = bls.fields.Fp12.ZERO;\n\tconst fp12_one = bls.fields.Fp12.ONE;\n\tconst fp12_pairing = bls.pairing(g1_a, g2_b);\n\tconst fp12_scalar_mul = bls.fields.Fp12.pow(fp12_pairing, scalar);\n\n\tconsole.log(\"Fp12 a:\", fp12ToHex(fp12_a));\n\tconsole.log(\"Fp12 b:\", fp12ToHex(fp12_b));\n\tconsole.log(\"Fp12 zero:\", fp12ToHex(fp12_zero));\n\tconsole.log(\"Fp12 one:\", fp12ToHex(fp12_one));\n\tconsole.log(\"Fp12 pairing:\", fp12ToHex(fp12_pairing));\n\tconsole.log(\"Fp12 scalar mul:\", fp12ToHex(fp12_scalar_mul));\n\n\tconst fp12_add = bls.fields.Fp12.add(fp12_a, fp12_b);\n\tconst fp12_sub = bls.fields.Fp12.sub(fp12_a, fp12_b);\n\tconst fp12_neg = bls.fields.Fp12.neg(fp12_a);\n\tconst fp12_mul = bls.fields.Fp12.mul(fp12_a, fp12_b);\n\tconst fp12_inv = bls.fields.Fp12.inv(fp12_a);\n\n\tconsole.log(\"Fp12 add:\", fp12ToHex(fp12_add));\n\tconsole.log(\"Fp12 sub:\", fp12ToHex(fp12_sub));\n\tconsole.log(\"Fp12 neg:\", fp12ToHex(fp12_neg));\n\tconsole.log(\"Fp12 mul:\", fp12ToHex(fp12_mul));\n\tconsole.log(\"Fp12 inv:\", fp12ToHex(fp12_inv));\n}\n\nfunction hexToFp12(hex: string): Fp12 {\n\tconst c0 = bls.fields.Fp6.create({\n\t\tc0: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(0, 96))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(96, 192))),\n\t\t}),\n\t\tc1: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(192, 288))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(288, 384))),\n\t\t}),\n\t\tc2: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(384, 480))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(480, 576))),\n\t\t}),\n\t});\n\tconst c1 = bls.fields.Fp6.create({\n\t\tc0: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(576, 672))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(672, 768))),\n\t\t}),\n\t\tc1: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(768, 864))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(864, 960))),\n\t\t}),\n\t\tc2: bls.fields.Fp2.create({\n\t\t\tc0: BigInt(\"0x\" + reverseEndianess(hex.slice(960, 1056))),\n\t\t\tc1: BigInt(\"0x\" + reverseEndianess(hex.slice(1056, 1152))),\n\t\t}),\n\t});\n\treturn bls.fields.Fp12.create({ c0, c1 });\n}\n\nfunction convertToCyclotomic(fp12: Fp12): Fp12 {\n\tconst p = BigInt(\n\t\t\"0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab\",\n\t); // BLS12-381 prime\n\tconst exponent = p ** BigInt(4) - p ** BigInt(2) + BigInt(1);\n\treturn bls.fields.Fp12.pow(fp12, exponent);\n}\n\nfunction fp12ToHex(fp12: Fp12): string {\n\tconst c0 = fp12.c0;\n\tconst c1 = fp12.c1;\n\treturn [\n\t\tbigintToBigEndianHex(c0.c0.c0, 48),\n\t\tbigintToBigEndianHex(c0.c0.c1, 48),\n\t\tbigintToBigEndianHex(c0.c1.c0, 48),\n\t\tbigintToBigEndianHex(c0.c1.c1, 48),\n\t\tbigintToBigEndianHex(c0.c2.c0, 48),\n\t\tbigintToBigEndianHex(c0.c2.c1, 48),\n\t\tbigintToBigEndianHex(c1.c0.c0, 48),\n\t\tbigintToBigEndianHex(c1.c0.c1, 48),\n\t\tbigintToBigEndianHex(c1.c1.c0, 48),\n\t\tbigintToBigEndianHex(c1.c1.c1, 48),\n\t\tbigintToBigEndianHex(c1.c2.c0, 48),\n\t\tbigintToBigEndianHex(c1.c2.c1, 48),\n\t].join(\"\");\n}\n\nconst testCrypt = (\n\tkzg: string,\n\tagg_key: string,\n): { encoded: string; ikm: string; ciph: Ciphertext } => {\n\ttry {\n\t\t// Validate inputs\n\t\tif (!isValidHex(kzg) || !isValidHex(agg_key)) {\n\t\t\tthrow new Error('Invalid input hex strings');\n\t\t}\n\n\t\tconst powersOfTau = decodePowersOfTau(kzg);\n\t\tconst aggregateKey = decodeAggregateKey(agg_key);\n\n\t\tconst ciph = encrypt(powersOfTau, aggregateKey, 2);\n\t\tconst encoded = encodeCiphertext(ciph);\n\t\tconst ikm = fp12ToHex(ciph.enc_key);\n\n\t\treturn { encoded, ikm, ciph };\n\t} catch (error) {\n\t\tconsole.error('Error in testCrypt:', error);\n\t\tthrow error;\n\t}\n};\n\nfunction bigintToBigEndianHex(value: bigint, length: number): string {\n\t// Convert BigInt to hex string without the '0x' prefix\n\tlet hex = value.toString(16);\n\n\t// Ensure the hex string is padded to the desired length\n\tif (hex.length > length * 2) {\n\t\tthrow new Error(\"BigInt value is too large to fit in the specified length\");\n\t}\n\n\t// Pad the hex string with leading zeros\n\thex = hex.padStart(length * 2, \"0\");\n\n\t// Convert the hex string to a byte array\n\tconst byteArray =\n\t\thex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [];\n\n\t// Reverse the byte array to get big-endian format\n\tconst reversedByteArray = byteArray.reverse();\n\n\t// Convert the reversed byte array back to a hex string\n\tconst bigEndianHex = reversedByteArray\n\t\t.map((byte) => byte.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n\n\treturn bigEndianHex;\n}\n\nfunction reverseEndianess(hex: string): string {\n\tif (hex.length % 2 !== 0) {\n\t\tthrow new Error(\"Hex string must have an even length\");\n\t}\n\treturn hex.match(/.{1,2}/g)?.reverse().join('') || '';\n}\n\nexport {\n\tdecodeAggregateKey,\n\tdecodePowersOfTau,\n\tencodeCiphertext,\n\tencrypt as ecncryptTest,\n\ttestCrypt,\n};\n","import { edwardsToMontgomeryPriv, edwardsToMontgomeryPub, x25519 } from '@noble/curves/ed25519';\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { ChaCha20Poly1305 } from \"@stablelib/chacha20poly1305\";\n\nexport const gen_stretched_key = (input: Uint8Array) => {\n const salt = new Uint8Array(32); // 32 bytes of zero\n const info = new TextEncoder().encode(\"aes_encryption\");\n return hkdf(sha256, input, salt, info, 32); // 32 bytes output key length\n};\n\nexport const gen_shared_key = (key: Uint8Array, pk: Uint8Array) => {\n const mg_key = edwardsToMontgomeryPriv(key);\n const mg_pk = edwardsToMontgomeryPub(pk);\n return x25519.getSharedSecret(mg_key, mg_pk);\n};\n\nexport const encrypt = (plaintext: Uint8Array, key: Uint8Array) => {\n const cipher = new ChaCha20Poly1305(key);\n const nonce = new Uint8Array(cipher.nonceLength);\n globalThis.crypto.getRandomValues(nonce);\n const ciphertext = cipher.seal(nonce, plaintext);\n return { ciphertext, nonce };\n};\n\nexport const decrypt = (ciphertext: Uint8Array, key: Uint8Array, nonce: Uint8Array) => {\n const cipher = new ChaCha20Poly1305(key);\n const res = cipher.open(nonce, ciphertext);\n return res;\n};\n","/**\n * Isomorphic assert utility that works in both Node.js and browser environments.\n * Replaces Node.js built-in assert for client-side compatibility.\n */\nexport function assert(\n condition: unknown,\n message?: string\n): asserts condition {\n if (!condition) {\n throw new Error(message ?? \"Assertion failed\");\n }\n}\n","import { WsProvider } from \"@polkadot/api\";\n\n/** Values the host application must supply through {@link init}. */\nexport interface PallioraConfig {\n /** WebSocket endpoint used for the chain API connection. */\n pallioraWs: string;\n /** RPC endpoint, when it differs from {@link PallioraConfig.pallioraWs}. */\n pallioraRpcUrl: string;\n /** Base URL of the cost-estimation service. */\n costEstimatorUrl: string;\n /** Base URL of the auth service that issues S3 pre-signed URLs. */\n authServiceUrl: string;\n /** AWS region of the artifact storage bucket. */\n awsRegion: string;\n /** Name of the artifact storage bucket. */\n awsS3Bucket: string;\n /** Enables debug logging. Defaults to `false`. */\n debug: boolean;\n /** Waits for finalization instead of returning once a tx is in-block. Defaults to `false`. */\n txWaitFinalization: boolean;\n}\n\ntype RequiredKey = Exclude<keyof PallioraConfig, \"debug\" | \"txWaitFinalization\">;\n\nlet config: Partial<PallioraConfig> | null = null;\nlet cachedProvider: WsProvider | null = null;\nlet cachedProviderUrl: string | null = null;\n\n/**\n * Initializes the SDK. Call this once, before any other SDK function.\n *\n * @remarks\n * Repeated calls merge into the existing configuration, so a host can supply\n * the chain endpoint at startup and storage settings later.\n */\nexport function init(options: Partial<PallioraConfig>): void {\n config = { ...config, ...options };\n}\n\n/** Whether {@link init} has been called. */\nexport function isInitialized(): boolean {\n return config !== null;\n}\n\n/** Clears the configuration. Intended for tests. */\nexport function resetConfig(): void {\n config = null;\n cachedProvider = null;\n cachedProviderUrl = null;\n}\n\nfunction read<K extends RequiredKey>(key: K): NonNullable<PallioraConfig[K]> {\n if (!config) {\n throw new Error(\n `Palliora SDK is not initialized: cannot read \"${key}\". ` +\n `Call init({ ${key}: ... }) before using the SDK.`,\n );\n }\n\n const value = config[key];\n if (value === undefined) {\n throw new Error(\n `Palliora SDK config \"${key}\" is not set. Pass it to init({ ${key}: ... }).`,\n );\n }\n\n return value as NonNullable<PallioraConfig[K]>;\n}\n\n/** @throws when `pallioraWs` was not supplied to {@link init}. */\nexport const getPallioraWs = (): string => read(\"pallioraWs\");\n\n/** @throws when `pallioraRpcUrl` was not supplied to {@link init}. */\nexport const getPallioraRpcUrl = (): string => read(\"pallioraRpcUrl\");\n\n/** @throws when `costEstimatorUrl` was not supplied to {@link init}. */\nexport const getCostEstimatorUrl = (): string => read(\"costEstimatorUrl\");\n\n/** @throws when `authServiceUrl` was not supplied to {@link init}. */\nexport const getAuthServiceUrl = (): string => read(\"authServiceUrl\");\n\n/** @throws when `awsRegion` was not supplied to {@link init}. */\nexport const getAwsRegion = (): string => read(\"awsRegion\");\n\n/** @throws when `awsS3Bucket` was not supplied to {@link init}. */\nexport const getAwsS3Bucket = (): string => read(\"awsS3Bucket\");\n\n/** Defaults to `false` when not supplied to {@link init}. */\nexport const isDebug = (): boolean => config?.debug ?? false;\n\n/** Defaults to `false` when not supplied to {@link init}. */\nexport const waitsForFinalization = (): boolean => config?.txWaitFinalization ?? false;\n\n/**\n * Returns the shared {@link WsProvider}, creating it on first use and replacing\n * it whenever `pallioraWs` changes.\n *\n * @throws when `pallioraWs` was not supplied to {@link init}.\n */\nexport function getProvider(): WsProvider {\n const url = getPallioraWs();\n\n if (!cachedProvider || cachedProviderUrl !== url) {\n cachedProvider = new WsProvider(url, 10000);\n cachedProviderUrl = url;\n }\n\n return cachedProvider;\n}\n","import { isDebug } from \"../config\";\nimport { Hex } from \"./types\";\n \n/**\n * Converts a hex string into a Uint8Array.\n *\n * @param hex - A hex-encoded string (must contain only hexadecimal characters, without any 0x prefix).\n * @returns A Uint8Array containing the byte values represented by the hex string.\n * @throws {Error} If the provided hex string has an odd length (invalid hex string).\n *\n * @example\n * hexToUint8Array(\"ff00a1\"); // => Uint8Array [255, 0, 161]\n */\nexport function hexToUint8Array(hex: Hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string\");\n }\n const arr = new Uint8Array(hex.length / 2);\n for (let i = 0; i < arr.length; i++) {\n arr[i] = parseInt(hex.substr(i * 2, 2), 16);\n }\n return arr;\n}\n \n/**\n * Encodes a Uint8Array into a Base64 string using the browser btoa API.\n *\n * Note: This implementation builds a binary string via String.fromCharCode for each byte and then calls btoa.\n * It is intended for browser environments where btoa is available. For very large arrays consider alternative approaches to avoid high memory usage.\n *\n * @param uint8Array - The bytes to encode as Base64.\n * @returns A Base64-encoded string representing the input bytes.\n *\n * @example\n * uint8ArrayToBase64(new Uint8Array([72, 101, 108, 108, 111])); // => \"SGVsbG8=\"\n */\nexport function uint8ArrayToBase64(uint8Array: Uint8Array) {\n let binary = \"\";\n for (let i = 0; i < uint8Array.length; i++) {\n binary += String.fromCharCode(uint8Array[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decodes a Base64 (or URL-safe Base64) string into a Uint8Array.\n *\n * This function normalizes URL-safe base64 by replacing '-' with '+' and '_' with '/', and it adds padding if missing\n * before decoding with atob. Works in browser environments where atob is available.\n *\n * @param base64 - A Base64 or URL-safe Base64 encoded string.\n * @returns The decoded bytes as a Uint8Array.\n *\n * @example\n * base64ToUint8Array(\"SGVsbG8=\"); // => Uint8Array [72, 101, 108, 108, 111]\n */\nexport const base64ToUint8Array = (base64: string): Uint8Array => {\n // Convert URL-safe base64 to standard base64.\n base64 = base64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n // Add padding if missing.\n while (base64.length % 4) {\n base64 += \"=\";\n }\n const binaryString = atob(base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n};\n\n/**\n * Decodes a Base64-encoded field into a Uint8Array and handles possible double-encoding.\n *\n * If expectedLength is provided and the decoded byte length does not match, this helper checks whether the decoded result\n * is exactly twice the expected length. If so, it treats the decoded bytes as a UTF-8 string containing another Base64 value,\n * decodes that second Base64 string, and returns it if it matches the expected length. Otherwise the initially decoded bytes are returned.\n *\n * @param field - The Base64 (or URL-safe Base64) encoded field to decode.\n * @param expectedLength - Optional expected length of the final decoded byte array. When provided, enables the double-decoding heuristic.\n * @returns The decoded bytes as a Uint8Array. If double-encoding is detected and validated, the inner decoded bytes are returned.\n *\n * @example\n * // Single-encoded\n * decodeField(\"SGVsbG8=\", 5); // => Uint8Array [72, 101, 108, 108, 111]\n *\n * @example\n * // Double-encoded: base64(base64(bytes))\n * decodeField(\"U0dWc2JHOGU=\", 5); // => Uint8Array [72, 101, 108, 108, 111]\n */\nexport const decodeField = (\n field: string,\n expectedLength?: number\n): Uint8Array => {\n const bytes = base64ToUint8Array(field);\n if (expectedLength && bytes.length !== expectedLength) {\n // If we got exactly twice as many bytes as expected, assume double-encoding.\n if (bytes.length === expectedLength * 2) {\n const intermediateStr = new TextDecoder().decode(bytes);\n const secondBytes = base64ToUint8Array(intermediateStr);\n if (secondBytes.length === expectedLength) {\n return secondBytes;\n }\n }\n }\n return bytes;\n};\n\n/**\n * Conditional debug logging utility.\n * Only logs when the debug flag is enabled in config.\n * \n * @param message - The message to log\n * @param optionalParams - Additional parameters to log\n */\nexport const debugLog = (message?: any, ...optionalParams: any[]) => {\n if (isDebug()) {\n console.log(message, ...optionalParams);\n }\n};\n","import { assert } from \"./assert\";\nimport { formatUnits, parseUnits } from \"viem\";\nimport { getApi } from \"../chain\";\n\nexport const PALI_SYMBOL = \"PALI\";\nexport const PALI_DECIMALS = 18;\n\ninterface TokenProperties {\n symbol: string;\n decimals: number;\n}\n\nexport type PaliAmountInput = string | number;\nexport type AtomicPaliAmount = bigint;\n\nlet tokenCache: TokenProperties | null = null;\n\nexport const toAtomicPaliAmount = (amount: PaliAmountInput): AtomicPaliAmount => {\n const normalizedAmount = String(amount).trim();\n\n if (!normalizedAmount) {\n throw new Error(\"Token amount cannot be empty\");\n }\n\n return parseUnits(normalizedAmount, PALI_DECIMALS);\n};\n\nexport const fromAtomicPaliAmount = (amount: bigint): string => {\n return formatUnits(amount, PALI_DECIMALS);\n};\n\nexport const formatPaliAmount = (amount: bigint, symbol: string = PALI_SYMBOL): string => {\n return `${fromAtomicPaliAmount(amount)} ${symbol}`;\n};\n\n/**\n * Fetch token name and decimals from RPC system properties\n * Results are cached for subsequent calls\n * @param rpc - RPC provider instance with system.properties method\n * @returns Promise<TokenProperties> with symbol and decimals\n */\nexport async function fetchTokenProperties(): Promise<TokenProperties> {\n // Return cached value if available\n if (tokenCache) {\n return tokenCache;\n }\n\n try {\n const systemProperties = (await (await getApi())?.rpc.system.properties())?.toHuman();\n\n assert(systemProperties, \"Failed to fetch system properties from RPC\");\n\n const tokenProperties: TokenProperties = {\n symbol: (systemProperties?.tokenSymbol as string[] || [PALI_SYMBOL])[0],\n decimals: Number((systemProperties?.tokenDecimals as string[] || [String(PALI_DECIMALS)])[0]),\n };\n\n // Store in cache\n tokenCache = tokenProperties;\n\n return tokenProperties;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Get cached token properties without making an RPC call\n * @returns TokenProperties or null if not yet cached\n */\nexport function getCachedTokenProperties(): TokenProperties | null {\n return tokenCache;\n}\n\n/**\n * Clear the token properties cache\n */\nexport function clearTokenCache(): void {\n tokenCache = null;\n}\n\n/**\n * Format balance using cached token properties\n * @param balance - The balance value to format\n * @returns Formatted balance string\n */\nexport async function formatBalanceWithTokenProperties(balance: string | number | bigint): Promise<string> {\n const tokenProperties = await fetchTokenProperties();\n\n return `${formatUnits(typeof balance === \"bigint\" ? balance : BigInt(balance), tokenProperties.decimals)} ${tokenProperties.symbol}`;\n}\n\nexport const tokenToBigint = toAtomicPaliAmount;\n","/**\n * Module providing singleton access to Polkadot API, WebSocket provider, and keyring.\n *\n * This module ensures that only one instance of the WsProvider, ApiPromise and Keyring\n * are created and reused across the application. It exposes a class-based wrapper\n * (RpcApi) for managed connect/disconnect flows and convenience functions for directly\n * obtaining the singleton instances.\n *\n * Notes:\n * - The API is created with custom RPC, types and signed extensions provided by\n * {@link API_RPC}, {@link API_TYPES} and {@link API_EXTENSIONS}.\n * - In non-test environments, the module attaches fatal handlers to the API that call\n * `process.exit(0)` on error/disconnect to allow an external supervisor to restart\n * the process.\n * - The keyring is created for `sr25519` keys. The convenience getter populates a\n * default development account derived from the well-known dev URI `//Bob`\n * (named \"Bob default\"). This is a development-only seed and MUST NOT be used\n * in production.\n */\nimport { ApiPromise, Keyring, WsProvider } from \"@polkadot/api\";\nimport { API_EXTENSIONS, API_RPC, API_TYPES } from \"./spec\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getProvider, getPallioraWs } from \"../config\";\n\n// Create singleton instances\nlet wsProvider: WsProvider | null = null;\nlet api: ApiPromise | null = null;\nlet apiUrl: string | null = null;\nlet keyring: Keyring | null = null;\n// Separate keyring instance intended for encryption-related keys/usages.\nlet encKeyring: Keyring | null = null;\nlet apiListenersAttached = false;\nlet apiTeardownInProgress = false;\n\n/**\n * getApi()\n *\n * Returns the singleton {@link ApiPromise} instance, creating it if necessary.\n *\n * @remarks\n * - Throws if the SDK has not been initialized with a `pallioraWs` endpoint\n * (see `init` in \"../config\").\n * - When creating the API, the configured `rpc`, `types` and `signedExtensions`\n * are applied.\n * - In non-test environments, top-level API `error` and `disconnected` events\n * cause the process to exit so that an external supervisor can restart the\n * process.\n *\n * @param cb - Optional callback function to attach to the \"disconnected\" event.\n *\n * @returns The singleton {@link ApiPromise} instance.\n */\nexport async function getApi(cb?: () => void) {\n const pallioraWs = getPallioraWs();\n\n if (api && pallioraWs !== apiUrl) {\n const staleApi = api;\n api = null;\n apiUrl = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n await staleApi.disconnect().catch(() => {});\n }\n\n if (!api) {\n api = await ApiPromise.create({\n provider: getProvider(),\n rpc: API_RPC,\n types: API_TYPES,\n signedExtensions: API_EXTENSIONS,\n });\n apiUrl = pallioraWs;\n }\n const isNode = typeof process !== \"undefined\" && typeof process.exit === \"function\";\n const isTest = typeof process !== \"undefined\" && process.env?.NODE_ENV === \"test\";\n if (isNode && !isTest && api && !apiListenersAttached) {\n apiListenersAttached = true;\n api.on(\"error\", (err) => {\n if (apiTeardownInProgress) return;\n apiTeardownInProgress = true;\n apiListenersAttached = false;\n\n const currentApi = api;\n api = null;\n\n void currentApi?.disconnect().catch((disconnectErr) => {\n apiTeardownInProgress = false;\n console.error(\"api disconnect after error failed:\", disconnectErr);\n });\n });\n api.on(\"disconnected\", () => {\n api = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n if (cb) cb();\n });\n }\n return api;\n}\n\n/**\n * disconnectApi()\n *\n * Tears down the singleton {@link ApiPromise} instance, if one exists.\n *\n * @remarks\n * Safe to call when no API has been created yet (no-op). After this resolves,\n * the next call to {@link getApi} creates a fresh instance.\n */\nexport async function disconnectApi() {\n if (!api) return;\n\n const current = api;\n api = null;\n apiUrl = null;\n apiListenersAttached = false;\n apiTeardownInProgress = false;\n\n await current.disconnect().catch(() => {});\n}\n\n/**\n * getKeyring()\n *\n * Returns the singleton {@link Keyring} instance, creating it if necessary.\n *\n * @remarks\n * - Ensures {@link waitReady} has resolved before constructing the keyring so\n * that WASM crypto is initialized.\n * - The keyring is created with `type: \"sr25519\"`.\n * - The function also adds a default development account from the dev seed URI\n * `//Bob` and labels it \"Bob default\".\n *\n * @important\n * The seed URI `//Bob` is a well-known development seed. It is convenient for\n * local testing but is insecure for any real funds or production use. Replace\n * or remove this default account when deploying to production.\n *\n * @returns The singleton {@link Keyring} instance.\n */\nexport async function getKeyring() {\n if (!keyring) {\n await waitReady();\n keyring = new Keyring({ type: \"sr25519\" });\n keyring.addFromUri('//Bob', { name: 'Bob default' });\n }\n return keyring;\n}\n\n/**\n * getEncKeyring()\n *\n * Returns the singleton encryption-focused {@link Keyring} instance, creating it\n * if necessary.\n *\n * @remarks\n * - Ensures {@link waitReady} has resolved before constructing the keyring so\n * that WASM crypto is initialized.\n * - The keyring is created with `type: \"sr25519\"` and a development default\n * account derived from the dev seed URI `//Bob` is added and labeled\n * \"Bob default (enc)\".\n *\n * @important\n * The seed URI `//Bob` is a well-known development seed and MUST NOT be used\n * in production for real funds. Replace or remove this default when deploying\n * to production.\n *\n * @returns The singleton {@link Keyring} instance used for encryption keys.\n */\nexport async function getEncKeyring() {\n if (!encKeyring) {\n await waitReady();\n encKeyring = new Keyring({ type: \"ed25519\" });\n encKeyring.addFromUri('//Bob', { name: 'Bob default (enc)' });\n }\n return encKeyring;\n}\n","import { waitsForFinalization } from \"../config\";\nimport { getApi } from \"./singleton\";\nimport { isFunction } from \"@polkadot/util\";\nimport { DEFAULT_COMPUTE_PAYLOAD } from \"./spec\";\nimport bs58 from \"bs58\";\nimport { getGuardianList } from \"../guardian\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { ISubmittableResult } from \"@polkadot/types/types\";\nimport type { EventRecord } from \"@polkadot/types/interfaces\";\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { Header, SignedBlock } from \"@polkadot/types/interfaces\";\nimport { AgreementStatus, ContractInfo, ContractType, SubmissionReceipt } from \"./types\";\n\n/** ISubmittableResult extended with the concrete blockNumber present after finalization */\ninterface SubmittableResultExtended extends ISubmittableResult {\n readonly blockNumber?: { toNumber(): number };\n}\n\nexport const signAndSend = async (request: SubmittableExtrinsic<'promise'>, account: KeyringPair, opts: Record<string, unknown> = DEFAULT_COMPUTE_PAYLOAD) => {\n // currencyId feeds ChargeCurrencyTransactionPayment's extra field; null (None) pays\n // fees in the native currency, matching pre-upgrade behavior. Callers may override.\n const signOpts = { currencyId: null, ...opts };\n const tx_result: SubmittableResultExtended = await new Promise((res, err) => {\n // opts contains custom chain-specific fields (daType, compute, etc.) that extend SignerOptions\n request.signAndSend(account, signOpts as Parameters<typeof request.signAndSend>[1], (result: SubmittableResultExtended) => {\n // console.trace(result.toHuman());\n if (result.isFinalized) {\n res(result);\n }\n if (!waitsForFinalization() && result.isInBlock) {\n res(result);\n }\n if (result.isError) err(result);\n });\n });\n // console.trace(tx_result.toHuman());\n\n if (tx_result.isError) {\n throw new Error(`Transaction failed with error: ${tx_result.dispatchError}`);\n }\n\n if (tx_result.dispatchError) {\n throw new Error(\n `Transaction dispatched with error: ${tx_result.dispatchError}`\n );\n }\n\n console.debug(\n `Transaction ${tx_result.txHash.toHex()} included in timepoint ${\n tx_result.blockNumber\n }-${tx_result.txIndex}`\n );\n\n return {\n blockNumber: tx_result.blockNumber?.toNumber() ?? 0,\n index: tx_result.txIndex ?? 0,\n hash: tx_result.txHash.toHex(),\n tx_result: tx_result as ISubmittableResult,\n };\n};\n\n/**\n * Retries {@link signAndSend} with exponential backoff, for RPC endpoints that\n * intermittently drop connections or time out mid-submission.\n *\n * @param request Unsigned extrinsic to submit\n * @param account Signing account\n * @param opts Extra signer options, forwarded to `signAndSend` (see its defaults)\n * @param retries Number of retry attempts after the initial try (default 3)\n * @param backoffMs Base delay before the first retry; doubles each subsequent attempt (default 1000)\n */\nexport const retrySignAndSend = async (\n request: SubmittableExtrinsic<'promise'>,\n account: KeyringPair,\n opts?: Record<string, unknown>,\n retries = 3,\n backoffMs = 1000,\n) => {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await signAndSend(request, account, opts);\n } catch (err) {\n lastError = err;\n if (attempt === retries) break;\n\n const delay = backoffMs * 2 ** attempt;\n debugLog(`retrySignAndSend: attempt ${attempt + 1} failed, retrying in ${delay}ms`, err);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n};\n\nexport const getFileMetadataCall = async (\n api: ApiPromise,\n metadataRef: [number, number]\n) => {\n const block = await getBlock(api, metadataRef[0]);\n const call = block.block.extrinsics[metadataRef[1]];\n return call.method;\n};\n\nconst getBlock = async (api: ApiPromise, blockNumber: number) => {\n const blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n return await api.rpc.chain.getBlock(blockHash);\n};\n\nexport const getGuardianAddress = async () => {\n const api = await getApi();\n\n if (!api) throw new Error(\"API not initialized\");\n assert(\n isFunction(api.query[\"guardian\"]?.[\"workerByKey\"]),\n `api.query.guardian.workerByKey does not exist`,\n );\n\n const list = await getGuardianList();\n\n const addresses = await Promise.all(\n list.map(async (item) => {\n const peerid = bs58.decode(item).slice(6, 38);\n return ((await api.query[\"guardian\"][\"workerByKey\"](peerid)).toString());\n })\n );\n\n return list.map((peerid, index) => ({ peerid, address: addresses[index] }));\n};\n\nexport const getGuardianNwParams = async () => {\n try {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const rpc = api.rpc as unknown as Record<\n string,\n Record<string, (...params: unknown[]) => Promise<unknown>>\n >;\n const section = \"guardian\";\n const method = \"guardianNwParams\";\n\n assert(\n isFunction(rpc[section]?.[method]),\n `api.rpc.${section}.guardianNwParams does not exist`\n );\n\n const guardianNwParams = (await rpc[section][method]()) as Record<\n string,\n unknown\n >;\n if (\n typeof guardianNwParams === \"object\" &&\n guardianNwParams !== null &&\n \"kzg\" in guardianNwParams\n ) {\n return (guardianNwParams.kzg as { toHex(): string }).toHex().slice(2);\n } else {\n throw new Error(`Invalid ${guardianNwParams} format`);\n }\n } catch (error) {\n console.error({ error });\n throw error;\n }\n};\n\n/**\n * Reads back the on-chain record for an agreement/contract created via\n * `createAgreement`, from `compute.contracts`.\n *\n * @param contractId - Hex-encoded agreement ID (as returned by `createAgreement`).\n * @returns The decoded {@link ContractInfo}, or `null` if no contract exists for that ID.\n */\nexport async function getContractInfo(contractId: string): Promise<ContractInfo | null> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n assert(\n isFunction(api.query[\"compute\"]?.[\"contracts\"]),\n `api.query.compute.contracts does not exist`,\n );\n\n const raw = await api.query[\"compute\"][\"contracts\"](contractId);\n const info = raw.toPrimitive() as {\n status: AgreementStatus;\n owner: string;\n originBlock: number;\n invocationBlock: number;\n index: number;\n usagePrice: number | string;\n contractType: ContractType;\n } | null;\n\n if (!info) return null;\n\n return {\n status: info.status,\n owner: info.owner,\n originBlock: info.originBlock,\n invocationBlock: info.invocationBlock,\n index: info.index,\n usagePrice: BigInt(info.usagePrice),\n contractType: info.contractType,\n };\n}\n\n/**\n * Fetches the block at `blockHeight`, extracts the extrinsic at\n * `extrinsicIndex`, and returns both the raw codec object and its human-readable\n * decoded form.\n *\n * Throws if the block cannot be found or the index is out of range.\n */\nexport async function fetchAndDecodeExtrinsic(\n blockHeight: number,\n extrinsicIndex: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<{ raw: any; decoded: Record<string, unknown> }> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const blockHash = await api.rpc.chain.getBlockHash(blockHeight);\n const signedBlock = await api.rpc.chain.getBlock(blockHash);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n if (extrinsicIndex >= extrinsics.length) {\n throw new Error(\n `extrinsic index ${extrinsicIndex} out of range — ` +\n `block ${blockHeight} has ${extrinsics.length} extrinsics`,\n );\n }\n\n const raw = extrinsics[extrinsicIndex];\n const decoded = raw.toHuman() as Record<string, unknown>;\n\n return { raw, decoded };\n}\n\n/**\n * Finds the first event record matching `section`/`method` (case-insensitive)\n * among a transaction's emitted events, e.g. `tx_result.events` from {@link signAndSend}.\n */\nexport function findEvent(\n events: EventRecord[],\n section: string,\n method: string,\n): EventRecord | undefined {\n return events.find(\n (record) =>\n record.event.section.toLowerCase() === section.toLowerCase() &&\n record.event.method.toLowerCase() === method.toLowerCase(),\n );\n}\n\nexport type BlockScanFilter =\n | {\n /** Pallet name, e.g. \"dataAvailability\" (case-insensitive) */\n section: string;\n /** Event name, e.g. \"DaccGuardianGroup\" (case-insensitive) */\n method: string;\n predicate?: never;\n }\n | {\n /**\n * Custom predicate called for every event record in each scanned block.\n * The full signed block is pre-fetched before any predicate call.\n * Return true to accept the match and resolve, false to skip and keep scanning.\n */\n predicate: (block: SignedBlock, event: EventRecord['event'], phase: EventRecord['phase']) => boolean | Promise<boolean>;\n section?: never;\n method?: never;\n };\n\nexport type BlockScanResult = {\n blockHash: string;\n blockNumber: number;\n /** Index of the extrinsic that emitted the event, or null for inherents */\n extrinsicIndex: number | null;\n /** Returns the full signed block; cached when predicate mode was used */\n block: () => Promise<SignedBlock>;\n /** All event records for this block */\n events: EventRecord[];\n};\n\n/**\n * Subscribes to new block headers and resolves with a match descriptor as soon\n * as a qualifying event is found.\n *\n * Supply exactly one of:\n * - `section` + `method` — lightweight name match, no block fetch\n * - `predicate(block, event, phase)` — full control; block is pre-fetched\n *\n * @param api Connected ApiPromise instance\n * @param filter Either a name filter or a predicate (mutually exclusive)\n * @param startBlock Ignore blocks with a number strictly below this value\n * @param maxBlocks Reject after scanning this many blocks; pass 0 to wait indefinitely (default 20)\n */\nexport const scanForBlockEvent = (\n api: ApiPromise,\n filter: BlockScanFilter,\n startBlock?: number,\n maxBlocks = 20\n): Promise<BlockScanResult> => {\n const hasPredicate = \"predicate\" in filter;\n let blocksScanned = 0;\n let done = false;\n\n return new Promise((resolve, reject) => {\n const unsubPromise: Promise<() => void> = api.rpc.chain.subscribeNewHeads(\n async (header: Header) => {\n if (done) return;\n\n const currentBlock: number = header.number.toNumber();\n if (startBlock !== undefined && currentBlock < startBlock) return;\n\n blocksScanned++;\n if (maxBlocks > 0 && blocksScanned > maxBlocks) {\n done = true;\n unsubPromise.then((unsub) => unsub());\n reject(new Error(`No matching event found within ${maxBlocks} blocks`));\n return;\n }\n\n try {\n const blockHash = await api.rpc.chain.getBlockHash(currentBlock);\n\n // Pre-fetch block when using predicate so the caller can inspect extrinsics\n const eventsResult = await api.query.system.events.at(blockHash);\n const events = eventsResult as unknown as EventRecord[];\n const blockData: SignedBlock | null = await (hasPredicate ? api.rpc.chain.getBlock(blockHash) : Promise.resolve(null));\n\n for (const record of events) {\n const { event, phase } = record;\n\n const matched: boolean = hasPredicate\n ? await (filter as { predicate: Function }).predicate(blockData, event, phase)\n : event.section.toLowerCase() === (filter as { section: string; method: string }).section.toLowerCase() &&\n event.method.toLowerCase() === (filter as { section: string; method: string }).method.toLowerCase();\n\n if (!matched) continue;\n\n done = true;\n unsubPromise.then((unsub) => unsub());\n resolve({\n blockHash: blockHash.toHex(),\n blockNumber: currentBlock,\n extrinsicIndex: phase.isApplyExtrinsic ? phase.asApplyExtrinsic.toNumber() : null,\n block: blockData ? () => Promise.resolve(blockData) : () => api.rpc.chain.getBlock(blockHash),\n events,\n });\n return;\n }\n } catch (err) {\n debugLog(`scanForBlockEvent: error scanning block ${currentBlock}: ${err}`);\n }\n }\n );\n });\n};\n\n/**\n * Resolves as soon as the next block header is produced. Useful as a plain\n * polling tick, e.g. between rounds of a manual wait loop.\n */\nexport async function waitForNextBlock(): Promise<{ blockNumber: number; blockHash: string }> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n return new Promise((resolve, reject) => {\n let unsubFn: (() => void) | undefined;\n let settled = false;\n\n api.rpc.chain.subscribeNewHeads((header: Header) => {\n if (settled) return;\n settled = true;\n unsubFn?.();\n resolve({ blockNumber: header.number.toNumber(), blockHash: header.hash.toHex() });\n }).then((fn) => {\n if (settled) fn();\n else unsubFn = fn;\n }).catch((err) => {\n if (!settled) {\n settled = true;\n reject(err);\n }\n });\n });\n}\n\n/**\n * Subscribes to new block headers and scans each block's extrinsics until a\n * `compute.result` extrinsic matching `requestId` is found. Resolves with the\n * {@link SubmissionReceipt} (extrinsic hash, block height, and extrinsic index).\n *\n * The result-relay submits the extrinsic asynchronously, so this watcher may\n * need to observe several blocks before the tx lands.\n *\n * @param requestId - The hex-encoded request ID to match (e.g. \"0xabc123…\").\n * @param timeoutMs - Milliseconds to wait before giving up (default: 10 min).\n */\nexport async function watchForSubmissionReceipt(\n requestId: string,\n timeoutMs = 10 * 60 * 1_000,\n): Promise<SubmissionReceipt> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n return new Promise<SubmissionReceipt>((resolve, reject) => {\n let unsubFn: (() => void) | undefined;\n let settled = false;\n\n const cleanup = (settleFn: () => void) => {\n if (settled) return;\n settled = true;\n unsubFn?.();\n settleFn();\n };\n\n const timer = setTimeout(\n () => cleanup(() => reject(new Error(`receipt watch timed out for requestId=${requestId}`))),\n timeoutMs,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.rpc.chain.subscribeNewHeads(async (header: any) => {\n if (settled) return;\n try {\n const blockNumber: number = header.number.toNumber();\n const blockHash = header.hash;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const signedBlock: any = await api.rpc.chain.getBlock(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n\n for (let i = 0; i < extrinsics.length; i++) {\n const ext = extrinsics[i];\n const decoded = ext.toHuman() as Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const method = decoded?.method as any;\n\n if (\n String(method?.section ?? '').toLowerCase() === 'compute' &&\n String(method?.method ?? '').toLowerCase() === 'result'\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const args = method?.args as any;\n // The first argument to compute.result is the request ID.\n const onChainId = String(args?.request_id ?? args?.requestId ?? args?.[0] ?? '');\n\n if (onChainId === requestId) {\n clearTimeout(timer);\n cleanup(() =>\n resolve({\n extrinsicHash: (ext.hash as { toHex(): string }).toHex(),\n blockHeight: blockNumber,\n extrinsicIndex: i,\n }),\n );\n return;\n }\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[watchReceipt] block check failed requestId=${requestId}: ${msg}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }).then((fn: any) => {\n if (settled) {\n // Already resolved/rejected before the subscribe promise returned — unsub now.\n (fn as () => void)();\n } else {\n unsubFn = fn as () => void;\n }\n }).catch((err: unknown) => {\n clearTimeout(timer);\n cleanup(() => reject(err));\n });\n });\n}\n\n/**\n * Fetches block events at `blockHeight` and returns the request ID from the\n * `compute.AgreementCreated` event emitted by the extrinsic at `extrinsicIndex`.\n * Returns `null` if no matching event is found for that extrinsic.\n */\nexport async function getAgreementCreatedRequestId(\n blockHeight: number,\n extrinsicIndex: number,\n): Promise<string | null> {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const blockHash = await api.rpc.chain.getBlockHash(blockHeight);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const apiAt = await api.at(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allEvents = (await apiAt.query.system.events()) as unknown as EventRecord[];\n\n // Only consider events produced by the extrinsic at our index.\n const extrinsicEvents = allEvents.filter(\n (record) => record.phase.isApplyExtrinsic && record.phase.asApplyExtrinsic.toNumber() === extrinsicIndex,\n );\n\n const match = findEvent(extrinsicEvents, \"compute\", \"AgreementCreated\");\n if (!match) return null;\n\n // Decode event data and extract the request ID.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dataHuman = match.event.data.toHuman() as Record<string, unknown> | unknown[];\n if (Array.isArray(dataHuman)) {\n const first = dataHuman[0];\n if (first != null) return String(first);\n } else if (dataHuman !== null && typeof dataHuman === 'object') {\n const id = dataHuman['requestId'] ?? dataHuman['request_id'] ?? dataHuman['id'];\n if (id != null) return String(id);\n }\n\n return null;\n}\n","import type { ApiPromise } from \"@polkadot/api\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getApi } from \"../chain\";\nimport { isFunction } from \"@polkadot/util\";\nimport { assert } from \"../utils\";\n\nexport const getGuardianList = async () => {\n const api = await getApi();\n if (!api) throw new Error(\"API not initialized\");\n\n const rpc = api.rpc as unknown as Record<\n string,\n Record<string, (...params: unknown[]) => Promise<unknown>>\n >;\n const section = \"guardian\";\n const method = \"guardianList\";\n\n assert(\n isFunction(rpc[section]?.[method]),\n `api.rpc.${section}.${method} does not exist`,\n );\n\n const list = ((await rpc[section][\"guardianList\"]()) as Array<Text>)\n .map((item) => [item.toString()])\n .flat(1);\n\n return list;\n};\n\nexport interface ActiveGuardian {\n account: string;\n guardianPrefs: Record<string, unknown> | null;\n stakersOverview: Record<string, unknown> | null;\n}\n\n/**\n * Current-era on-chain guardians with staking prefs and ledger totals.\n * Does not disconnect the shared API.\n */\nexport async function getActiveGuardians(\n apiInstance?: ApiPromise,\n): Promise<ActiveGuardian[]> {\n await waitReady();\n const api = apiInstance ?? (await getApi());\n if (!api) throw new Error(\"API not initialized\");\n\n const guardians = await api.query.guardian.guardians();\n const accounts = (guardians?.toJSON() || []) as string[];\n\n return Promise.all(\n accounts.map(async (account) => {\n const [prefs, ledger] = await Promise.all([\n api.query.staking.guardians(account),\n api.query.staking.ledger(account),\n ]);\n\n return {\n account,\n guardianPrefs: (prefs?.toHuman?.() as Record<string, unknown>) ?? null,\n stakersOverview: (ledger?.toHuman?.() as Record<string, unknown>) ?? null,\n };\n }),\n );\n}\n","import { getApi, getGuardianNwParams, signAndSend, scanForBlockEvent, fetchAndDecodeExtrinsic } from \"../chain\";\nimport { GuardianGroupInfo, OnChainRef } from \"..\";\nimport { hexToUint8Array, debugLog, assert } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { ApiPromise } from \"@polkadot/api\";\nimport type { GuardianAddress } from \"../da/types\";\n\nexport const createGuardianGroup = async (account: KeyringPair, selectedGuardians: GuardianAddress[]) => {\n try {\n const api = await getApi();\n\n assert(selectedGuardians.length >= 3, \"Not enough guardians available to create a group\");\n assert(account, \"Failed to load account\");\n assert(api, \"Failed to initialize API\");\n\n const tau_params = await getGuardianNwParams();\n assert(tau_params && tau_params !== \"\", \"Failed to retrieve guardian network parameters\");\n\n // For simplicity, select the first 3 guardians\n debugLog(`Selected guardians: ${selectedGuardians.join(\", \")} and tau_params: ${tau_params}`);\n\n // Create and send the transaction\n const tx = api.tx.dataAvailability.daccGuardianGroup(\n selectedGuardians,\n Array.from(hexToUint8Array(tau_params as `0x${string}`)) // Use the new helper function\n );\n const result = await signAndSend(tx, account);\n\n debugLog(\"Guardian group created:\", result);\n return result;\n } catch (error) {\n console.error(\"Error creating guardian group:\", error);\n throw new Error(`Failed to create guardian group: ${error instanceof Error ? error.message : error}`);\n }\n};\n\n/**\n * Creates a guardian group with exactly 3 guardians, waits for tx confirmation,\n * then watches incoming blocks for the `DaccGuardianGroup` event (emitted by a\n * subsequent `daccGuardianGroupInfo` extrinsic) and returns the decoded args.\n *\n * @param account Signing account\n * @param guardians Exactly 3 guardian addresses / peer-ids\n * @param maxBlocks Give up waiting for the event after this many blocks; 0 = indefinite (default 20)\n */\nexport const createGuardianGroupAndWatch = async (\n account: KeyringPair,\n guardians: GuardianAddress[],\n maxBlocks = 20\n): Promise<GuardianGroupInfo> => {\n assert(guardians.length === 3, \"Exactly 3 guardians are required\");\n assert(account, \"Failed to load account\");\n\n const api = await getApi();\n assert(api, \"Failed to initialize API\");\n\n debugLog(`Submitting guardian group creation...`);\n // daccGuardianGroup emits DaccGuardianGroup with empty group_pk/tau_params/agg_key.\n // Start listening from the next block so we only catch the DaccGuardianGroup event\n // emitted by the subsequent daccGuardianGroupInfo extrinsic.\n const creationResult = await createGuardianGroup(account, guardians);\n const startBlock: number = (creationResult?.blockNumber ?? 0) + 1;\n debugLog(`Group creation tx confirmed at block ${startBlock - 1}. Listening for DaccGuardianGroup event from block ${startBlock}...`);\n\n const match = await scanForBlockEvent(\n api,\n {\n predicate: async (block, event, phase) => {\n if (\n event.section.toLowerCase() !== \"dataavailability\" ||\n event.method.toLowerCase() !== \"daccguardiangroup\"\n ) return false;\n if (!phase.isApplyExtrinsic) return false;\n const ext = block.block.extrinsics[phase.asApplyExtrinsic.toNumber()];\n return (\n ext?.method?.section?.toLowerCase() === \"dataavailability\" &&\n ext?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\"\n );\n },\n },\n startBlock,\n maxBlocks\n );\n\n // Block is pre-fetched by scanForBlockEvent when using predicate mode\n assert(match.extrinsicIndex !== null, \"DaccGuardianGroup event was not emitted by an extrinsic\");\n debugLog(`DaccGuardianGroup event found at block ${match.blockNumber}, extrinsic index ${match.extrinsicIndex}. Decoding args...`);\n\n const block = await match.block();\n const ext = block.block.extrinsics[match.extrinsicIndex];\n\n // daccGuardianGroupInfo(group_id: H256, group_pk: AppData, tau_params: AppData, agg_key: AppData)\n const [group_id, group_pk, tau_params, agg_key] = ext.method.args;\n debugLog(`Guardian group parameters decoded: group_id=${group_id.toHex()}`);\n\n return {\n groupId: group_id.toHex(),\n groupPk: group_pk.toHex(),\n tauParams: tau_params.toHex(),\n aggKey: agg_key.toHex(),\n guardians,\n };\n};\n\n/**\n * Walks blocks forward from `startBlock`, fetching each directly via RPC (not a\n * live subscription), looking for the first `dataAvailability.daccGuardianGroupInfo`\n * extrinsic. Needed because {@link scanForBlockEvent} only observes new block headers\n * and cannot find an extrinsic that already landed on-chain.\n *\n * @param maxBlocks Give up after scanning this many blocks; 0 = scan to current chain tip\n */\nasync function findGuardianGroupInfoExtrinsic(\n api: ApiPromise,\n startBlock: number,\n maxBlocks: number\n): Promise<OnChainRef> {\n const tip = (await api.rpc.chain.getHeader()).number.toNumber();\n const endBlock = maxBlocks > 0 ? Math.min(startBlock + maxBlocks - 1, tip) : tip;\n\n for (let blockNumber = startBlock; blockNumber <= endBlock; blockNumber++) {\n const blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const signedBlock: any = await api.rpc.chain.getBlock(blockHash);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const extrinsics: any[] = signedBlock.block.extrinsics;\n\n for (let index = 0; index < extrinsics.length; index++) {\n const ext = extrinsics[index];\n if (\n ext?.method?.section?.toLowerCase() === \"dataavailability\" &&\n ext?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\"\n ) {\n return { blockNumber, index };\n }\n }\n }\n\n throw new Error(\n `No daccGuardianGroupInfo extrinsic found in blocks ${startBlock}-${endBlock} ` +\n `(searched ${Math.max(endBlock - startBlock + 1, 0)} block(s) after the creation extrinsic)`\n );\n}\n\n/**\n * Reconstructs a guardian group's full crypto params from the two on-chain\n * extrinsics that together define it. There is no direct RPC to query group\n * info by ID, so this reads it back from where it was written:\n *\n * - `dataAvailability.daccGuardianGroup(selectedGuardians, tauParams)` — the\n * creation extrinsic; carries the guardian list.\n * - `dataAvailability.daccGuardianGroupInfo(groupId, groupPk, tauParams, aggKey)`\n * — the result extrinsic (submitted separately once the group's crypto\n * params are computed); carries the actual group_id/group_pk/tau_params/agg_key.\n *\n * `groupId` isn't a required input — like {@link createGuardianGroupAndWatch},\n * it's derived from decoding the result extrinsic, not supplied by the caller.\n *\n * @param creationRef Block number + extrinsic index of the group creation extrinsic\n * @param resultRef Block number + extrinsic index of the group creation result\n * extrinsic. If omitted, blocks are scanned forward from\n * `creationRef` to find it (see `maxBlocks`).\n * @param maxBlocks Only used when `resultRef` is omitted. Give up scanning after\n * this many blocks; 0 = scan to current chain tip (default 20)\n */\nexport const getGuardianGroupInfo = async (\n creationRef: OnChainRef,\n resultRef?: OnChainRef,\n maxBlocks = 20\n): Promise<GuardianGroupInfo> => {\n assert(creationRef, \"Group creation extrinsic reference is required\");\n\n const api = await getApi();\n assert(api, \"Failed to initialize API\");\n\n debugLog(`Reading guardian group creation extrinsic at block ${creationRef.blockNumber}, index ${creationRef.index}...`);\n const { raw: creationExt } = await fetchAndDecodeExtrinsic(creationRef.blockNumber, creationRef.index);\n assert(\n creationExt?.method?.section?.toLowerCase() === \"dataavailability\" &&\n creationExt?.method?.method?.toLowerCase() === \"daccguardiangroup\",\n `Extrinsic at block ${creationRef.blockNumber}, index ${creationRef.index} is not a daccGuardianGroup call ` +\n `(found ${creationExt?.method?.section}.${creationExt?.method?.method})`\n );\n\n // daccGuardianGroup(selected_guardians: Vec<GuardianAddress>, tau_params: AppData)\n const [selectedGuardiansArg] = creationExt.method.args;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const guardians = (Array.from(selectedGuardiansArg) as any[]).map((g) => g.toString()) as GuardianAddress[];\n debugLog(`Guardian group creation extrinsic decoded: guardians=${guardians.join(\", \")}`);\n\n const resolvedResultRef =\n resultRef ??\n (await (async () => {\n debugLog(\n `No result extrinsic reference given, scanning forward from block ${creationRef.blockNumber + 1} for daccGuardianGroupInfo...`\n );\n return findGuardianGroupInfoExtrinsic(api, creationRef.blockNumber + 1, maxBlocks);\n })());\n\n debugLog(`Reading guardian group result extrinsic at block ${resolvedResultRef.blockNumber}, index ${resolvedResultRef.index}...`);\n const { raw: resultExt } = await fetchAndDecodeExtrinsic(resolvedResultRef.blockNumber, resolvedResultRef.index);\n assert(\n resultExt?.method?.section?.toLowerCase() === \"dataavailability\" &&\n resultExt?.method?.method?.toLowerCase() === \"daccguardiangroupinfo\",\n `Extrinsic at block ${resolvedResultRef.blockNumber}, index ${resolvedResultRef.index} is not a daccGuardianGroupInfo call ` +\n `(found ${resultExt?.method?.section}.${resultExt?.method?.method})`\n );\n\n // daccGuardianGroupInfo(group_id: H256, group_pk: AppData, tau_params: AppData, agg_key: AppData)\n const [group_id, group_pk, tau_params, agg_key] = resultExt.method.args;\n debugLog(`Guardian group result extrinsic decoded: group_id=${group_id.toHex()}`);\n\n return {\n groupId: group_id.toHex(),\n groupPk: group_pk.toHex(),\n tauParams: tau_params.toHex(),\n aggKey: agg_key.toHex(),\n guardians,\n };\n};\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\n/** Classes of compute a guardian can declare a fee threshold against. */\nexport const COMPUTE_TYPES = [\"trusted\", \"tee\", \"mpc\", \"fhe\", \"zkp\"] as const;\n\nexport type ComputeType = (typeof COMPUTE_TYPES)[number];\n\n/** A rate in atomic units, already converted from PALI by the caller. */\nexport type FeeThresholdInput = bigint | string | number;\n\nconst CHAIN_COMPUTE_TYPE: Record<ComputeType, string> = {\n trusted: \"Trusted\",\n tee: \"Tee\",\n mpc: \"Mpc\",\n fhe: \"Fhe\",\n zkp: \"Zkp\",\n};\n\nexport interface GuardianJoinPrefs {\n compute?: string;\n /**\n * Minimum rate to take work on at, in atomic units. A single amount applies to every\n * compute type named in `compute`; a per-type record prices each one separately.\n * Compute types left unpriced carry no threshold on chain, which reads as zero — the\n * guardian accepts any rate for them.\n */\n fee?: FeeThresholdInput | Partial<Record<ComputeType, FeeThresholdInput>>;\n standard?: boolean;\n verifier?: boolean;\n}\n\nfunction parseComputeTypes(compute: string | undefined): ComputeType[] {\n const requested = (compute || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n // Filtering the canonical list drops duplicates, which `staking.guard` rejects.\n return COMPUTE_TYPES.filter((type) => requested.includes(type));\n}\n\nfunction buildFeeThresholds(\n fee: GuardianJoinPrefs[\"fee\"],\n computeTypes: ComputeType[],\n): [string, bigint][] {\n if (fee === undefined || fee === null || fee === \"\") {\n return [];\n }\n\n if (typeof fee !== \"object\") {\n assert(\n computeTypes.length > 0,\n \"A single fee threshold needs compute preferences to apply to. Set compute preferences, or declare thresholds per compute type.\",\n );\n return computeTypes.map((type) => [CHAIN_COMPUTE_TYPE[type], BigInt(fee)]);\n }\n\n return Object.entries(fee).map(([type, amount]) => {\n assert(\n (COMPUTE_TYPES as readonly string[]).includes(type),\n `Unknown compute type \"${type}\" in fee thresholds. Allowed: ${COMPUTE_TYPES.join(\", \")}`,\n );\n assert(\n computeTypes.includes(type as ComputeType),\n `Fee threshold declared for \"${type}\", which is not among the compute preferences (${computeTypes.join(\", \") || \"none\"})`,\n );\n return [CHAIN_COMPUTE_TYPE[type as ComputeType], BigInt(amount as FeeThresholdInput)];\n });\n}\n\nexport async function joinGuardian(account: KeyringPair, prefs: GuardianJoinPrefs) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const computeTypes = parseComputeTypes(prefs.compute);\n const feeThresholds = buildFeeThresholds(prefs.fee, computeTypes);\n\n const guardianPrefs = {\n pubKey: account.publicKey,\n guardian: prefs.standard,\n verifier: prefs.verifier,\n compute: prefs.compute ? true : false,\n computePrefs: {\n trusted: computeTypes.includes(\"trusted\"),\n tee: computeTypes.includes(\"tee\"),\n mpc: computeTypes.includes(\"mpc\"),\n fhe: computeTypes.includes(\"fhe\"),\n zkp: computeTypes.includes(\"zkp\"),\n },\n feeThresholds,\n };\n\n debugLog(\n account.address,\n \"joining as guardian with preferences:\",\n {\n ...guardianPrefs,\n feeThresholds: feeThresholds.map(\n ([type, threshold]) => `${type}: ${formatPaliAmount(threshold)}`,\n ),\n }\n );\n\n const guardTx = api.tx.staking.guard(guardianPrefs);\n const hash = await signAndSend(guardTx, account);\n\n debugLog(\"Guardian join tx sent with hash:\", hash.hash);\n}\n","\nimport { ApiPromise } from \"@polkadot/api\";\nimport { testCrypt } from \"../crypto/core\";\nimport { encrypt, gen_stretched_key } from \"../crypto/cipher\";\nimport { hexToUint8Array, uint8ArrayToBase64 } from \"../utils\";\nimport type { Hex } from \"viem\";\nimport { signAndSend } from \"./utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { GuardianGroupInfo } from \"../da/types\";\n\ntype OnChainFileOptions = {\n\tfile: File;\n\tfilePath: string,\n\tfileName: string;\n\tdescription: string;\n\tbaseCost: bigint;\n\townerL2Address: string;\n\tguardianInfo: GuardianGroupInfo;\n}\n\ntype ChunkRef = { blockNumber: number; extrinsicIndex: number };\n\ntype FileMetadata = {\n\tname: string;\n\tdescription: string;\n\tstartRef: [number, number];\n};\n\nconst getBlock = async (api: ApiPromise, blockNumber: number) => {\n\tconst blockHash = await api.rpc.chain.getBlockHash(blockNumber);\n\treturn await api.rpc.chain.getBlock(blockHash);\n};\nconst getFileMetadataCall = async (api: ApiPromise, metadataRef: [number, number]) => {\n\tconst block = await getBlock(api, metadataRef[0]);\n\tconst call = block.block.extrinsics[metadataRef[1]];\n\treturn call.method;\n};\n\nconst getFileMetadata = async (api: ApiPromise, metadataRef: [number, number]): Promise<FileMetadata> => {\n\tconst call = await getFileMetadataCall(api, metadataRef);\n\n\t// @ts-expect-error\n\tconst name = new TextDecoder().decode(call.args[0]);\n\t// @ts-expect-error\n\tconst description = new TextDecoder().decode(call.args[1]);\n\t// @ts-expect-error\n\tconst startRef = [call.args[2][0].toNumber(), call.args[2][1].toNumber()] as [number, number];\n\n\treturn {\n\t\tname,\n\t\tdescription,\n\t\tstartRef,\n\t};\n};\n\nasync function getFileSHA256(file: File): Promise<string> {\n\tconst buffer = new Array(12).fill(8);\n\t// const hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n\tconst hashArray = Array.from(new Uint8Array(buffer));\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n\treturn hashHex;\n\n}\n\nconst readDataFromChain = async (api: ApiPromise, dataRef: [number, number]) => {\n\tconst call = await getFileMetadataCall(api, dataRef);\n\treturn call.args[0].toU8a();\n};\n\nclass MCryptFs {\n\t_api;\n\t_init;\n\t_metaRef: [number, number] | null;\n\t_metadata: FileMetadata | null;\n\t_chunkRefs: ChunkRef[];\n\n\tconstructor(mcryptApi: any, metadataRef: [number, number] | null, metadata: FileMetadata | null) {\n\t\tthis._api = mcryptApi;\n\t\tthis._metaRef = metadataRef;\n\t\tthis._metadata = metadata;\n\t\tthis._init = true;\n\t\tthis._chunkRefs = [];\n\t}\n\n\tstatic dummyInstance(mcryptApi: any) {\n\t\treturn new MCryptFs(mcryptApi, null, null);\n\t}\n\n\tisValid() {\n\t\tif (!this._metaRef) {\n\t\t\tthrow new Error(\"Metadata reference not set\");\n\t\t}\n\n\t\tif (\n\t\t\t!this._metadata ||\n\t\t\t!this._metadata.name ||\n\t\t\t!this._metadata.description ||\n\t\t\t!this._metadata.startRef\n\t\t) {\n\t\t\tthrow new Error(\"Metadata not set properly\");\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\tthis.isValid();\n\t\treturn this._metadata;\n\t}\n}\n\nclass MCryptFsWriter {\n\t_file;\n\t_filePath;\n\t_description;\n\t_chunkSize;\n\t_fileKey: string;\n\t_fileName: string;\n\t_baseCost;\n\t_ownerL2Address;\n\t_guardianInfo: GuardianGroupInfo;\n\t_api;\n\t_account: KeyringPair;\n\t_chunkRefs: ChunkRef[];\n\t_blockNumber;\n\t_extrinsicIndex;\n\t_progress;\n\t_error: Error | null;\n\n\tconstructor(fileOptions: OnChainFileOptions, chunkSize = 500, mcryptApi: any, account: KeyringPair) {\n\t\tconst {\n\t\t\tfile: iFile,\n\t\t\tfilePath,\n\t\t\tfileName,\n\t\t\tdescription,\n\t\t\tbaseCost,\n\t\t\townerL2Address,\n\t\t\tguardianInfo,\n\t\t} = fileOptions;\n\n\t\tthis._file = iFile;\n\t\tthis._filePath = filePath;\n\t\tthis._description = description;\n\t\tthis._fileName = fileName;\n\t\tthis._baseCost = baseCost;\n\t\tthis._fileKey = \"\";\n\t\tthis._ownerL2Address = ownerL2Address;\n\t\tthis._guardianInfo = guardianInfo;\n\t\tthis._chunkSize = chunkSize * 1024;\n\t\tthis._api = mcryptApi;\n\t\tthis._account = account;\n\n\t\tthis._chunkRefs = [];\n\t\tthis._blockNumber = 0;\n\t\tthis._extrinsicIndex = 0;\n\n\t\tthis._progress = {\n\t\t\tiFileSize: iFile.size,\n\t\t\tiBlocksWritten: 0,\n\t\t};\n\n\t\tthis._error = null;\n\t}\n\n\tprependMetadata(chunk: Blob) {\n\t\tconst blockNumberBuffer = new ArrayBuffer(4);\n\t\tconst blockView = new DataView(blockNumberBuffer);\n\t\tblockView.setUint32(0, this._blockNumber, false);\n\n\t\tconst extIndexBuffer = new ArrayBuffer(4);\n\t\tconst extView = new DataView(extIndexBuffer);\n\t\textView.setUint32(0, this._extrinsicIndex, false);\n\n\t\treturn new Blob([blockNumberBuffer, extIndexBuffer, chunk]);\n\t}\n\n\tasync writeChunk(chunk: Blob): Promise<{ blockNumber: number; index: number }> {\n\t\tconst request = this._api.tx.dataAvailability.submitData(\n\t\t\tArray.from(new Uint8Array(await chunk.arrayBuffer()))\n\t\t);\n\t\tconsole.log(\"account: \", this._account);\n\t\treturn new Promise<{ blockNumber: number; index: number }>((resolve) => {\n\t\t\trequest.signAndSend(this._account, { app_id: 1, currencyId: null }, (result: { isInBlock: boolean; isFinalized: boolean; isError: boolean; blockNumber?: { toNumber(): number }; txIndex?: number }) => {\n\t\t\t\tif (result.isInBlock || result.isFinalized || result.isError) {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tblockNumber: result.blockNumber?.toNumber() ?? 0,\n\t\t\t\t\t\tindex: result.txIndex ?? 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitKey(account: KeyringPair, data: string) {\n\t\tconst { encoded: encryptedKey, ikm } = testCrypt(this._guardianInfo.tauParams, this._guardianInfo.aggKey);\n\n\t\tconst td_params = uint8ArrayToBase64(hexToUint8Array(encryptedKey as Hex));\n\t\tconst shared_key = gen_stretched_key(\n\t\t\thexToUint8Array(ikm as Hex),\n\t\t);\n\t\tconst { ciphertext, nonce } = encrypt(\n\t\t\tnew Uint8Array(Uint8Array.from(data)),\n\t\t\tshared_key\n\t\t);\n\t\tconst blobRef = this._chunkRefs[this._chunkRefs.length - 1];\n\n\t\tconst modelSubmit = JSON.stringify({\n\t\t\tnonce: uint8ArrayToBase64(Uint8Array.from(nonce)),\n\t\t\tciphertext: uint8ArrayToBase64(Uint8Array.from(ciphertext)),\n\t\t\ttd_params,\n\t\t\tgroup_pk: this._guardianInfo.groupPk,\n\t\t\ttau_params: this._guardianInfo.tauParams,\n\t\t\tchosen_guardians: this._guardianInfo.guardians,\n\t\t\tblobRef: [blobRef.blockNumber, blobRef.extrinsicIndex],\n\t\t});\n\n\t\tconst request = this._api.tx.dataAvailability.submitData(modelSubmit);\n\t\treturn await signAndSend(request, account);\n\t}\n\n\tasync writeMetadata() {\n\n\t\tconst encoder = new TextEncoder();\n\t\tconst fileName = this._fileName;\n\t\tconst datasetRef = await this.submitKey(this._account, this._fileKey);\n\t\tconst keyRef = [datasetRef.blockNumber, datasetRef.index];\n\t\tconst request = this._api.tx.dataAvailability.daccRegisterData(\n\t\t\tArray.from(new TextEncoder().encode(fileName)),\n\t\t\tArray.from(new TextEncoder().encode(this._description)),\n\t\t\tkeyRef,\n\t\t\tthis._baseCost,\n\t\t\t0,\n\t\t\tArray.from(encoder.encode(this._ownerL2Address)),\n\t\t\tthis._guardianInfo.groupId,\n\t\t);\n\n\t\treturn await signAndSend(request, this._account);\n\t}\n\n\tasync writeFile() {\n\t\tconst chunks = [];\n\t\tlet offset = 0;\n\n\t\twhile (offset < this._file.size) {\n\t\t\tconst chunk = this._file.slice(offset, offset + this._chunkSize);\n\t\t\tconst prependedChunk = this.prependMetadata(chunk);\n\t\t\tconst blockInfo = await this.writeChunk(prependedChunk);\n\n\t\t\tthis._blockNumber = blockInfo.blockNumber;\n\t\t\tthis._extrinsicIndex = blockInfo.index;\n\t\t\tthis._progress.iBlocksWritten += chunk.size;\n\t\t\tthis._chunkRefs.push({\n\t\t\t\tblockNumber: this._blockNumber,\n\t\t\t\textrinsicIndex: this._extrinsicIndex,\n\t\t\t});\n\n\t\t\toffset += this._chunkSize;\n\t\t}\n\n\t\tthis._fileKey = (await getFileSHA256(this._file)) as string;\n\t\tconst metadataRef = await this.writeMetadata();\n\t\treturn await FileFromMetadataRef(this._api, [\n\t\t\tmetadataRef.blockNumber,\n\t\t\tmetadataRef.index ?? 0,\n\t\t]);\n\t}\n}\n\nclass MCryptFsReader {\n\t_filename;\n\t_api;\n\t_onChainFile: MCryptFs;\n\n\tconstructor(filename: string, mcryptApi: any, onChainFile: MCryptFs) {\n\t\tthis._filename = filename;\n\t\tthis._api = mcryptApi;\n\t\tthis._onChainFile = onChainFile;\n\t}\n\n\tasync downloadFile() {\n\t\tconst chunks = [];\n\n\t\tif (!this._onChainFile._metadata) {\n\t\t\tthrow new Error(\"Metadata not loaded\");\n\t\t}\n\n\t\tlet _blockNumber = this._onChainFile._metadata.startRef[0];\n\t\tlet _extIndex = this._onChainFile._metadata.startRef[1];\n\n\t\twhile (_blockNumber !== 0) {\n\t\t\tconst prependedChunk = await readDataFromChain(this._api, [\n\t\t\t\t_blockNumber,\n\t\t\t\t_extIndex,\n\t\t\t]);\n\t\t\tconst chunk = prependedChunk.slice(12);\n\t\t\tchunks.push(chunk);\n\n\t\t\tconst view = new DataView(new Uint8Array(prependedChunk).buffer);\n\t\t\t_blockNumber = view.getUint32(4);\n\t\t\t_extIndex = view.getUint32(8);\n\t\t}\n\n\t\t// Combine all chunks into a single blob\n\t\tconst blob = new Blob(chunks.reverse());\n\n\t\t// Create download link\n\t\tconst url = URL.createObjectURL(blob);\n\t\tconst a = document.createElement(\"a\");\n\t\ta.href = url;\n\t\ta.download = this._filename;\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\tdocument.body.removeChild(a);\n\t\tURL.revokeObjectURL(url);\n\n\t\treturn blob;\n\t}\n}\n\nconst FileFromMetadataRef = async (mcryptApi: any, metadataRef: [number, number]) => {\n\tconst metadata = await getFileMetadata(mcryptApi, metadataRef);\n\treturn new MCryptFs(mcryptApi, metadataRef, metadata);\n};\n\nexport { MCryptFs, MCryptFsWriter, MCryptFsReader, FileFromMetadataRef };\n","import type { ApiPromise } from \"@polkadot/api\";\nimport { waitReady } from \"@polkadot/wasm-crypto\";\nimport { getApi } from \"./singleton\";\n\nexport interface LatestBlock {\n height: number;\n hash: string;\n time: number;\n validator: string;\n eventsCount: number;\n extrinsicsCount: number;\n}\n\nexport interface LatestBlocksResult {\n blocks: LatestBlock[];\n latestHeight: number;\n}\n\n/**\n * Newest on-chain blocks first, paged backward from the current tip.\n * Uses RPC rather than the indexer `/api/blocks` list.\n */\nexport async function getLatestBlocks(\n count: number,\n page = 0,\n apiInstance?: ApiPromise,\n): Promise<LatestBlocksResult> {\n await waitReady();\n const api = apiInstance ?? (await getApi());\n if (!api) throw new Error(\"API not initialized\");\n\n const header = await api.rpc.chain.getHeader();\n const latestHeight = header.number.toNumber();\n const start = latestHeight - page * count;\n if (start < 0) {\n return { blocks: [], latestHeight };\n }\n\n const heights: number[] = [];\n for (let height = start; height >= Math.max(0, start - count + 1); height -= 1) {\n heights.push(height);\n }\n\n const blocks = await Promise.all(\n heights.map(async (height) => {\n const hash = await api.rpc.chain.getBlockHash(height);\n const [signed, derived, at] = await Promise.all([\n api.rpc.chain.getBlock(hash),\n api.derive.chain.getHeader(hash).catch(() => null),\n api.at(hash),\n ]);\n const [timestamp, events] = await Promise.all([\n at.query.timestamp.now(),\n at.query.system.events(),\n ]);\n\n return {\n height,\n hash: hash.toHex(),\n time: Number(timestamp.toString()),\n validator: derived?.author?.toString?.() ?? \"\",\n\t\t\t\textrinsicsCount: signed.block.extrinsics.length,\n\t\t\t\teventsCount: (events as unknown as { length: number }).length,\n };\n }),\n );\n\n return { blocks, latestHeight };\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { formatBalanceWithTokenProperties } from \"../utils/token\";\n\nexport interface Balance {\n free: bigint;\n reserved: bigint;\n frozen: bigint;\n /** Free balance formatted with the chain's token symbol/decimals, e.g. \"1.5 PALI\". */\n formatted: string;\n}\n\n/** Reads an account's free/reserved/frozen balance from `system.account`. */\nexport async function getBalance(address: string): Promise<Balance> {\n const api = await getApi();\n assert(api, \"API not initialized\");\n\n const account = (await api.query.system.account(address)).toPrimitive() as {\n data: { free: string | number; reserved: string | number; frozen: string | number };\n };\n\n const free = BigInt(account.data.free);\n const reserved = BigInt(account.data.reserved);\n const frozen = BigInt(account.data.frozen);\n\n return {\n free,\n reserved,\n frozen,\n formatted: await formatBalanceWithTokenProperties(free),\n };\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { getBalance, type Balance } from \"../token/balance\";\n\nexport interface AccountInfo {\n address: string;\n nonce: number;\n balance: Balance;\n /** On-chain identity display name, or `null` if none is set. */\n displayName: string | null;\n}\n\nfunction extractDisplayName(display: unknown): string | null {\n if (!display || display === \"None\") return null;\n if (typeof display === \"string\") return display;\n if (typeof display === \"object\" && \"Raw\" in (display as Record<string, unknown>)) {\n return String((display as { Raw: unknown }).Raw);\n }\n return null;\n}\n\n/** Convenience read combining balance, nonce, and identity display name for a single account. */\nexport async function getAccountInfo(address: string): Promise<AccountInfo> {\n const api = await getApi();\n assert(api, \"API not initialized\");\n\n const [accountData, balance, identity] = await Promise.all([\n api.query.system.account(address),\n getBalance(address),\n api.query.identity.identityOf(address),\n ]);\n\n const nonce = (accountData.toPrimitive() as { nonce: number }).nonce;\n const identityHuman = identity.toHuman() as { info?: { display?: unknown } } | null;\n\n return {\n address,\n nonce,\n balance,\n displayName: extractDisplayName(identityHuman?.info?.display),\n };\n}\n","import { findEvent, getApi, getGuardianAddress, getKeyring, signAndSend, type API_TYPES } from \"../chain\";\nimport { assert, debugLog, toAtomicPaliAmount } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { GuardianAddress } from \"../da/types\";\nimport type { CurrencyId, Fee } from \"../chain/types\";\n\n/**\n * Converts a {@link Fee} into the on-chain `fees` / `computeRate` pair.\n * `computeRate` only has meaning for `Active` contracts (it drives dynamic\n * fee calculation during `compute.result`); omit `computeRate` for `Dormant`\n * contracts.\n */\nexport function buildFee(fee?: Fee) {\n return {\n fees: toAtomicPaliAmount(fee?.amount ?? \"0\"),\n computeRate: toAtomicPaliAmount(fee?.computeRate ?? \"0\"),\n };\n}\n\n/** Zero `H256` — the `groupId` of a contract that belongs to no guardian group. */\nexport const NO_GUARDIAN_GROUP = `0x${\"00\".repeat(32)}`;\n\n/**\n * Classification carried in `ComputeMetadata.storeType`.\n *\n * Mirrors `pallet_compute::StoreType` variant-for-variant via {@link API_TYPES}.\n * Order is the encoding: the variant index is what goes on the wire, so an\n * omitted or reordered variant silently shifts every one after it.\n */\nexport type StoreType = keyof typeof API_TYPES.StoreType._enum;\n\nexport interface ComputeMetadataInput {\n /** Human-readable name of the registered artifact. */\n name: string;\n /** Human-readable description of the registered artifact. */\n description: string;\n /** What kind of artifact this is. */\n storeType: StoreType;\n /**\n * H256 of the guardian group this entry belongs to. Defaults to\n * {@link NO_GUARDIAN_GROUP} — correct for plaintext contracts, which have no\n * group. The chain stores this field but never reads it.\n */\n groupId?: string;\n}\n\n/**\n * Converts a {@link ComputeMetadataInput} into the on-chain `ComputeMetadata`,\n * whose `name` and `description` are byte vectors rather than strings.\n * Returns `null` for absent metadata, which is what `Option<ComputeMetadata>`\n * expects.\n */\nexport function buildComputeMetadata(metadata?: ComputeMetadataInput) {\n if (!metadata) return null;\n\n const encoder = new TextEncoder();\n return {\n name: Array.from(encoder.encode(metadata.name)),\n description: Array.from(encoder.encode(metadata.description)),\n storeType: metadata.storeType,\n groupId: metadata.groupId ?? NO_GUARDIAN_GROUP,\n };\n}\n\nexport interface ComputeContract {\n contractType: \"Active\" | \"Dormant\";\n guardians: GuardianAddress[];\n preCheck?: unknown;\n compute: Record<string, unknown>;\n postCheck?: unknown;\n resultCipher: unknown;\n /** Currency the deposit is reserved in and settlement is paid out in. Defaults to \"Native\". */\n currencyId?: CurrencyId;\n}\n\nexport async function createAgreement(\n contract: ComputeContract,\n account: KeyringPair,\n oracle_quore_id: string | undefined = undefined,\n): Promise<{\n blockNumber: number;\n index: number;\n hash: string;\n agreementId?: string;\n}> {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n // currencyId defaults to \"Native\", reproducing pre-upgrade behavior for callers\n // that don't opt into paying the contract deposit/settlement in another currency.\n const onChainContract = { currencyId: \"Native\" as const, ...contract };\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"compute\"][\"agreement\"](onChainContract, oracle_quore_id ?? null);\n const opts = {\n compute: {\n daType: 1,\n verification: 0,\n compute: contract.contractType === \"Active\" ? 1 : 0,\n },\n };\n\n const { tx_result, blockNumber, index, hash } = await signAndSend(\n tx,\n account,\n opts,\n );\n\n if (!tx_result.isError) {\n const agreementCreatedEvent = findEvent(tx_result.events, \"compute\", \"AgreementCreated\");\n\n if (agreementCreatedEvent) {\n debugLog(\"Agreement data:\", agreementCreatedEvent.event.data.toString());\n return {\n blockNumber,\n index: index ?? 0,\n hash,\n agreementId:\n agreementCreatedEvent.event.data[0]?.toHex?.() ??\n agreementCreatedEvent.event.data.toString(),\n };\n } else {\n debugLog(\"AgreementCreated event not found\");\n }\n }\n\n return { blockNumber, index: index ?? 0, hash };\n}\n\nexport interface InvokeAgreementInput {\n /** Guardian account IDs handling the invocation; matches the agreement's guardian set. */\n guardians: GuardianAddress[];\n /** Cipher suite describing how `data` is encrypted. Use \"Plaintext\" for unencrypted payloads. */\n cipher: unknown;\n /** Invocation payload bytes (already encrypted if `cipher` is not \"Plaintext\"). */\n data: Uint8Array | number[];\n}\n\n/**\n * Invokes an existing `Subscription`-type agreement with a new payload, via\n * `compute.invoke`.\n *\n * @param agreementId - Hex-encoded agreement ID (as returned by `createAgreement`).\n */\nexport async function invokeAgreement(\n agreementId: string,\n input: InvokeAgreementInput,\n account: KeyringPair,\n opts?: Record<string, unknown>,\n) {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"compute\"][\"invoke\"](\n agreementId,\n input.guardians,\n input.cipher,\n { Inline: { data: Array.from(input.data) } },\n );\n\n return signAndSend(tx, account, opts);\n}\n\nexport async function createSimpleAgreement() {\n const guardianIds = (await getGuardianAddress())\n .slice(0, 3)\n .map((g) => g.address);\n assert(guardianIds.length === 3, \"Not enough guardians to create agreement\");\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: guardianIds,\n preCheck: null,\n compute: {\n cipher: \"Plaintext\",\n computerIndices: [0, 1, 2],\n ...buildFee({ amount: \"0\", computeRate: \"0\" }),\n deadline: 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: null,\n program: { NativeData: \"DaFalse\" },\n metadata: null,\n },\n postCheck: null,\n resultCipher: \"Plaintext\",\n };\n\n const keyring = await getKeyring();\n const account = keyring.getPairs()[0];\n\n return createAgreement(contract, account);\n}\n\nexport default createSimpleAgreement;\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { ComputeMetadataInput } from \"./agreement\";\n\nexport interface DataContractParams {\n /** URL pointing to the data to store. Mutually exclusive with `data`. */\n url?: string;\n /**\n * Bytes carried in the extrinsic itself, for payloads small enough not to\n * warrant off-chain hosting. Mutually exclusive with `url`.\n */\n data?: string | Uint8Array;\n /** Guardian account IDs that participate in this contract. */\n guardians: string[];\n /**\n * Absolute fee offered for the contract. Defaults to 0.\n * `computeRate` is omitted: this is a `Dormant` contract and the\n * compute rate only applies to `Active` contracts.\n */\n fee: Fee;\n /**\n * Describes the registered artifact — name, description, and the `storeType`\n * saying what kind of thing it is. Omitted metadata registers the contract\n * anonymously, which leaves nothing on-chain to tell a stored dataset from a\n * stored program.\n */\n metadata?: ComputeMetadataInput;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits a dormant data-store contract on-chain via `compute.agreement`.\n *\n * - No encryption (Plaintext cipher suite)\n * - Trusted confidentiality mode\n * - Input fetched from a URL, or carried inline in the extrinsic\n * - No pre-check or post-check verifications\n * - Plain (unencrypted) result\n *\n * The artifact goes in `compute.input` and `compute.program` stays inert: a\n * `Dormant` contract registers something rather than running it. A later\n * `Active` contract reaches this artifact with `{ ContractId: { id } }`, in\n * either its own `input` or its `program`, and pays this contract's owner the\n * `fee` offered here as the usage price.\n */\nexport async function dataContract(params: DataContractParams, account: KeyringPair) {\n const plaintextCipher = \"Plaintext\";\n assert(\n (params.url === undefined) !== (params.data === undefined),\n \"dataContract requires exactly one of `url` or `data`\",\n );\n\n const input =\n params.url !== undefined\n ? { Url: { url: Array.from(new TextEncoder().encode(params.url)) } }\n : {\n Inline: {\n data: Array.from(\n typeof params.data === \"string\"\n ? new TextEncoder().encode(params.data)\n : (params.data as Uint8Array),\n ),\n },\n };\n\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input,\n program: {\n NativeData: \"DaFalse\",\n },\n metadata: buildComputeMetadata(params.metadata),\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getApi } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { toAtomicPaliAmount } from \"../utils/token\";\nimport type { PaliAmountInput } from \"../utils/token\";\n\n/**\n * The chain-side parameters the compute fee floor is derived from.\n *\n * All four are read live: the first three are root-settable storage values\n * (`compute.setMaxDaStorageSize`, `setProviderStorageRate`,\n * `setThresholdDecryptionFee`), so a hard-coded copy goes stale silently and\n * surfaces only as an `InsufficientFreeBalance` at submission time.\n */\nexport interface FeeParams {\n /** Bytes of DA storage a result is priced against. */\n maxDaStorageSize: bigint;\n /** Price per byte of DA storage, in atomic units. */\n providerStorageRate: bigint;\n /** Flat fee split between the contract's guardians, in atomic units. */\n thresholdDecryptionFee: bigint;\n /** Block time in milliseconds, the multiplier applied to `computeRate`. */\n millisecondsPerBlock: bigint;\n}\n\nexport interface MinFeeInput {\n /** Per-millisecond compute rate the contract offers, in PALI. */\n computeRate: PaliAmountInput;\n /** Contract ID supplying the input, whose owner is owed the input fee. */\n inputContractId?: string;\n}\n\n/** The fee floor and the four components it is built from, all in atomic units. */\nexport interface MinFeeBreakdown {\n /** `maxDaStorageSize * providerStorageRate` — pays whoever submits the result. */\n resultFee: bigint;\n /** `usagePrice` of the referenced input contract, or 0 when none is referenced. */\n inputFee: bigint;\n /** Flat threshold-decryption fee, split between the contract's guardians. */\n thresholdDecryptionFee: bigint;\n /** `computeRate * millisecondsPerBlock` — one block's worth of compute. */\n offeredComponent: bigint;\n /** The sum: the smallest `fees` the chain accepts for this contract. */\n minFee: bigint;\n}\n\n/**\n * `MillisecondsPerBlock` is a plain `Get<u64>` on `pallet_compute::Config`, not a\n * `#[pallet::constant]`, so it is absent from metadata and cannot be read as\n * `api.consts.compute.millisecondsPerBlock`. The runtime wires both it and\n * `Babe::ExpectedBlockTime` to the same `MILLISECS_PER_BLOCK` constant, so Babe's\n * copy is read instead, falling back to twice the timestamp minimum period.\n */\nasync function readMillisecondsPerBlock(): Promise<bigint> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n\n const expectedBlockTime = api.consts.babe?.expectedBlockTime;\n if (expectedBlockTime) {\n return BigInt(expectedBlockTime.toString());\n }\n\n const minimumPeriod = api.consts.timestamp?.minimumPeriod;\n assert(minimumPeriod, \"Cannot determine block time: neither babe.expectedBlockTime nor timestamp.minimumPeriod exists\");\n\n return BigInt(minimumPeriod.toString()) * 2n;\n}\n\n/**\n * Reads the four live chain parameters that define the compute fee floor.\n *\n * Throws when the connected runtime predates the metered-compute upgrade: older\n * runtimes expose a `compute` pallet with neither these storage items nor the\n * `Contract`-shaped `agreement` call, so there is no fee floor to report.\n */\nexport async function getFeeParams(): Promise<FeeParams> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n assert(\n api.query.compute?.maxDaStorageSize,\n \"compute.maxDaStorageSize does not exist on this runtime: the connected chain predates \" +\n \"metered compute, and has no fee floor. Check PALLIORA_WS points at a current node.\",\n );\n\n const [maxDaStorageSize, providerStorageRate, thresholdDecryptionFee, millisecondsPerBlock] =\n await Promise.all([\n api.query.compute.maxDaStorageSize(),\n api.query.compute.providerStorageRate(),\n api.query.compute.thresholdDecryptionFee(),\n readMillisecondsPerBlock(),\n ]);\n\n return {\n maxDaStorageSize: BigInt(maxDaStorageSize.toString()),\n providerStorageRate: BigInt(providerStorageRate.toString()),\n thresholdDecryptionFee: BigInt(thresholdDecryptionFee.toString()),\n millisecondsPerBlock,\n };\n}\n\n/**\n * Computes the smallest `fees` an `Active` or `Subscription` contract may offer.\n *\n * Mirrors `pallet_compute::Pallet::fee_components`, which `CheckCompute` enforces\n * when validating the extrinsic and which `compute.result` settles against. An\n * offer below this floor is rejected as `InsufficientFreeBalance` before the\n * agreement is ever included in a block.\n *\n * Clearing this floor is necessary but not sufficient: guardians independently\n * reject an agreement whose `computeRate` is under their own per-compute-type\n * threshold. See CHAIN-RULES.md (\"Two gates, not one\").\n *\n * `Dormant` contracts reserve nothing and are exempt — they may offer any `fees`,\n * including zero.\n */\nexport async function estimateMinFee(input: MinFeeInput): Promise<MinFeeBreakdown> {\n const api = await getApi();\n assert(api, \"Api not initialized\");\n\n const params = await getFeeParams();\n\n const resultFee = params.maxDaStorageSize * params.providerStorageRate;\n\n let inputFee = 0n;\n if (input.inputContractId) {\n const contract = (await api.query.compute.contracts(input.inputContractId)).toJSON() as Record<\n string,\n unknown\n > | null;\n if (contract) {\n inputFee = BigInt(String(contract[\"usagePrice\"] ?? contract[\"usage_price\"] ?? 0));\n }\n }\n\n const offeredComponent = toAtomicPaliAmount(input.computeRate) * params.millisecondsPerBlock;\n\n return {\n resultFee,\n inputFee,\n thresholdDecryptionFee: params.thresholdDecryptionFee,\n offeredComponent,\n minFee: resultFee + inputFee + params.thresholdDecryptionFee + offeredComponent,\n };\n}\n","import { edwardsToMontgomeryPub } from \"@noble/curves/ed25519\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport { getApi, signAndSend } from \"../chain\";\nimport { encrypt, gen_stretched_key, testCrypt } from \"../crypto\";\nimport { hexToUint8Array, Hex } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { GuardianGroupInfo } from \"../da/types\";\n\nexport interface EncryptedInferenceSubscriptionParams {\n /** Guardian account addresses that participate in this compute. */\n guardians: string[];\n /** Fee offered for the compute step. Defaults to 0. */\n fee?: Fee;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\nexport interface EncryptedInferenceSubscriptionInvocationParams {\n /** Hex-encoded agreement ID returned by encryptedInferenceSubscription. */\n agreementId: string;\n /** Input payload to encrypt and submit. String is UTF-8 encoded. */\n input: Uint8Array | string;\n /** Guardian addresses to route the compute request to. */\n guardians: string[];\n /** Guardian group cryptographic parameters for threshold encryption. */\n guardianInfo: GuardianGroupInfo;\n}\n\nexport interface EncryptedInferenceComputeParams {\n /** Input payload to encrypt and submit. String is UTF-8 encoded. */\n input: Uint8Array | string;\n /** Guardian account addresses that participate in this compute. */\n guardians: string[];\n /** Guardian group cryptographic parameters for threshold encryption. */\n guardianInfo: GuardianGroupInfo;\n /** Fee offered for the compute step. Defaults to 0. */\n fee?: Fee;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\n/**\n * Creates a Dormant agreement that registers encrypted inference compute terms.\n * The agreement ID returned here is passed to encryptedInferenceSubscriptionInvocation\n * for each subsequent encrypted inference call.\n */\nexport async function encryptedInferenceSubscription(\n params: EncryptedInferenceSubscriptionParams,\n account: KeyringPair,\n) {\n const computeStep = {\n cipher: \"Plaintext\",\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: null,\n program: { NativeExecute: \"Inference\" },\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: \"Plaintext\",\n };\n\n return createAgreement(contract, account);\n}\n\n/**\n * Invokes an existing encrypted inference subscription agreement with a\n * threshold-encrypted input payload. The result is encrypted back to encAccount.\n *\n * @param params - Agreement ID, input payload, guardians, and guardian group crypto params.\n * @param encAccount - Ed25519 keypair whose public key is used to receive the encrypted result.\n * @param account - Keypair used to sign and submit the transaction.\n */\nexport async function encryptedInferenceSubscriptionInvocation(\n params: EncryptedInferenceSubscriptionInvocationParams,\n encAccount: KeyringPair,\n account: KeyringPair,\n) {\n const api = await getApi();\n if (!api) throw new Error(\"Api not initialized\");\n\n const inputBytes =\n typeof params.input === \"string\"\n ? new TextEncoder().encode(params.input)\n : params.input;\n\n const { encoded: cyphtxt, ikm } = testCrypt(\n params.guardianInfo.tauParams,\n params.guardianInfo.aggKey,\n );\n\n const sharedKey = gen_stretched_key(hexToUint8Array(ikm as Hex));\n const { ciphertext, nonce } = encrypt(inputBytes, sharedKey);\n\n const cyphtxtBytes = hexToUint8Array(cyphtxt as Hex);\n const groupPkBytes = hexToUint8Array(params.guardianInfo.groupPk as Hex);\n const tauParamsBytes = hexToUint8Array(params.guardianInfo.tauParams as Hex);\n\n const tx = (\n api.tx as Record<\n string,\n Record<string, (...args: unknown[]) => SubmittableExtrinsic<\"promise\">>\n >\n )[\"dataAvailability\"][\"daccComputeRequest\"](\n edwardsToMontgomeryPub(encAccount.publicKey),\n nonce,\n Array.from(ciphertext),\n params.guardians[0],\n Array.from(cyphtxtBytes),\n Array.from(groupPkBytes),\n Array.from(tauParamsBytes),\n params.guardians,\n );\n\n const idHex = params.agreementId.startsWith(\"0x\")\n ? params.agreementId.slice(2)\n : params.agreementId;\n\n const opts = {\n compute: {\n da_type: 4,\n agreement: [Buffer.from(idHex, \"hex\")],\n verification: 0,\n compute: 1,\n },\n };\n\n return signAndSend(tx, account, opts);\n}\n\n/**\n * Convenience wrapper: creates an encrypted inference subscription then\n * immediately invokes it with the given input. Returns both receipts.\n *\n * @param params - Input payload, guardians, guardian group crypto params, and fee.\n * @param encAccount - Ed25519 keypair whose public key is used to receive the encrypted result.\n * @param account - Keypair used to sign and submit both transactions.\n */\nexport async function encryptedInferenceCompute(\n params: EncryptedInferenceComputeParams,\n encAccount: KeyringPair,\n account: KeyringPair,\n) {\n const subscription = await encryptedInferenceSubscription(\n {\n guardians: params.guardians,\n fee: params.fee,\n deadline: params.deadline,\n },\n account,\n );\n\n if (!subscription.agreementId) {\n throw new Error(\"Subscription creation did not return an agreement ID\");\n }\n\n const invocation = await encryptedInferenceSubscriptionInvocation(\n {\n agreementId: subscription.agreementId,\n input: params.input,\n guardians: params.guardians,\n guardianInfo: params.guardianInfo,\n },\n encAccount,\n account,\n );\n\n return { subscription, invocation };\n}\n","/**\n * Generates random bytes of the specified length.\n * Uses Web Crypto API (crypto.getRandomValues) - available in all modern browsers\n * and Node.js 18+.\n *\n * @param length Number of bytes.\n * @returns Uint8Array containing random bytes.\n */\nexport function generateRandomBytes(length: number = 32): Uint8Array {\n const bytes = new Uint8Array(length);\n const cr = globalThis.crypto;\n if (!cr || typeof cr.getRandomValues !== \"function\") {\n throw new Error(\n \"crypto.getRandomValues is not available. Ensure you're running in a supported environment (browser or Node.js 18+).\"\n );\n }\n cr.getRandomValues(bytes);\n return bytes;\n}\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport type { Fee } from \"../chain/types\";\n\nexport interface InferenceComputeParams {\n /** Raw input data — string will be UTF-8 encoded, Uint8Array used as-is. */\n input: Uint8Array | string;\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Fee offered for the compute step. Defaults to 0 amount and 0 compute rate. */\n fee: Fee;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n}\n\n/**\n * Submits a plain (unencrypted, no-confidentiality) inference compute request\n * on-chain via the `compute.agreement` extrinsic.\n *\n * - Input is sent inline (no DA layer indirection).\n * - Program is the native `Inference` executor.\n * - Pre-check and post-check are no-ops (no verification).\n * - Cipher fields carry zero-value placeholders (unused in the trusted path).\n * - Result is returned in plain (no re-encryption).\n */\nexport async function inferenceCompute(params: InferenceComputeParams, account: KeyringPair) {\n const inputData =\n typeof params.input === \"string\"\n ? Array.from(new TextEncoder().encode(params.input))\n : Array.from(params.input);\n\n // No encryption — use the Plaintext variant of CipherSuite.\n const plaintextCipher = \"Plaintext\";\n\n // Primary compute step: inline input + native inference execution.\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: 0 },\n feeFunction: null,\n input: { Inline: { data: inputData } },\n program: { NativeExecute: \"Inference\" },\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n compute: computeStep,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import bs58 from 'bs58';\nimport { disconnectApi, getApi } from '../chain';\n\nexport interface GuardianParticipants {\n\tnwState: {\n\t\tlocalPeerId: string | undefined;\n\t\tworker: unknown;\n\t\tcurrentEra: unknown;\n\t\tguardians: string | null;\n\t\tnextGuardians: string | null;\n\t\tcurrentIndex: unknown;\n\t\tnextIndex: number;\n\t};\n\tcurrentGuardians: unknown[];\n\tupcomingGuardians: unknown[];\n}\n\nexport async function getGuardianParticipants(): Promise<GuardianParticipants> {\n\tconst api = await getApi();\n\tif (!api) throw new Error('Api not initialized');\n\n\ttry {\n\t\tconst guardians = await api.query.guardian.guardians();\n\t\tconst nextGuardians = await api.query.guardian.nextGuardians();\n\t\tconst currentEra = await api.query.staking.currentEra();\n\t\tconst currentIndex = await api.query.guardian.currentIndex();\n\t\tconst peerid = await api.rpc.system.localPeerId();\n\t\tconst _peerid = bs58.decode((peerid || '').toString());\n\t\tconst account = await api.query.guardian.workerByKey(_peerid.slice(6, 38));\n\t\tconst nextIndex = currentIndex ? Number(currentIndex) + 1 : 1;\n\n\t\tconst guardiansList = (guardians?.toJSON() || []) as string[];\n\t\tconst nextGuardiansList = (nextGuardians?.toJSON() || []) as string[];\n\n\t\tconst buildDetails = async (list: string[]) => {\n\t\t\treturn Promise.all(\n\t\t\t\tlist.map(async (guardian: string) => {\n\t\t\t\t\tconst guardianPrefs = await api.query.staking.guardians(guardian);\n\t\t\t\t\tconst ledger = await api.query.staking.ledger(guardian);\n\t\t\t\t\tconst bonded = await api.query.staking.bonded(guardian);\n\t\t\t\t\tconst payee = await api.query.staking.payee(guardian);\n\t\t\t\t\tconst stakersOverview = await api.query.staking.erasStakersOverview(\n\t\t\t\t\t\tcurrentEra?.toPrimitive(),\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t);\n\t\t\t\t\tconst guardianErasPrefs = await api.query.staking.erasGuardianPrefs(\n\t\t\t\t\t\tcurrentEra?.toPrimitive(),\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tguardian,\n\t\t\t\t\t\trewardDestination: payee?.toHuman ? payee.toHuman() : null,\n\t\t\t\t\t\tcurrentPreferences: (guardianErasPrefs?.toHuman ? guardianErasPrefs.toHuman() : null),\n\t\t\t\t\t\tupcomingPreferences: (guardianPrefs?.toHuman ? guardianPrefs.toHuman() : null),\n\t\t\t\t\t\tstash: bonded?.toHuman ? bonded.toHuman() : null,\n\t\t\t\t\t\tcurrentStakeOverview: stakersOverview?.toHuman ? stakersOverview.toHuman() : null,\n\t\t\t\t\t\tupcomingStakeOverview: ledger?.toHuman ? ledger.toHuman() : null,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\t\t};\n\n\t\tconst currentGuardians = await buildDetails(guardiansList);\n\t\tconst upcomingGuardians = await buildDetails(nextGuardiansList);\n\n\t\treturn {\n nwState: {\n localPeerId: peerid?.toString(),\n worker: account?.toHuman ? account.toHuman() : null,\n currentEra: currentEra?.toHuman ? currentEra.toHuman() : null,\n guardians: JSON.stringify(guardians?.toHuman ? guardians.toHuman() : null, null, 2),\n nextGuardians: JSON.stringify(nextGuardians?.toHuman ? nextGuardians.toHuman() : null, null, 2),\n currentIndex: currentIndex?.toHuman ? currentIndex.toHuman() : null,\n nextIndex,\n },\n\t\t\tcurrentGuardians,\n\t\t\tupcomingGuardians,\n\t\t};\n\t} finally {\n\t\tawait disconnectApi();\n\t}\n}\n\nexport default getGuardianParticipants;\n\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getKeyring } from \"../chain\";\nimport { createAgreement, buildFee } from \"../compute\";\nimport type { Fee } from \"../chain/types\";\n\nexport interface SimpleComputeParams {\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Input reference block number from which to read the tx payload. */\n inputBlockNumber?: number;\n /** Input reference extrinsic index within the input block. */\n inputExtrinsicIndex?: number;\n /** Program location as URL. */\n programUrl: string;\n /** Fee offered for the compute step. Defaults to 0 amount and 0 compute rate. */\n fee?: Fee;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits a minimal trusted compute agreement:\n * - no encryption (plaintext cipher)\n * - trusted confidentiality mode\n * - input from chain transaction reference\n * - program fetched from URL\n * - no pre/post verification\n */\nexport async function simpleCompute(params: SimpleComputeParams, account: KeyringPair) {\n const plaintextCipher = \"Plaintext\";\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: null,\n program: {\n Url: {\n url: Array.from(new TextEncoder().encode(params.programUrl)),\n },\n },\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { KeyringPair } from \"@polkadot/keyring/types\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert } from \"../utils\";\nimport type { Fee } from \"../chain/types\";\nimport type { ComputeMetadataInput } from \"./agreement\";\n\nexport interface StoredComputeParams {\n /** Guardian account IDs that participate in this compute. */\n guardians: string[];\n /** Contract ID of the `Dormant` contract registering the program. */\n programContractId: string;\n /** Contract ID of the `Dormant` contract registering the input data. */\n inputContractId: string;\n /**\n * Fee offered for the compute step. Must clear the floor returned by\n * `estimateMinFee({ computeRate, inputContractId })` — referencing a stored\n * input raises that floor by the input contract's usage price.\n */\n fee: Fee;\n /** Describes this execution. Unlike the contracts it references, it registers\n * nothing — so `storeType` is `\"Other\"` unless the run itself produces a\n * classifiable artifact. */\n metadata?: ComputeMetadataInput;\n /** Block number deadline for the compute step. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n}\n\n/**\n * Submits an `Active` agreement whose program and input both live in contracts\n * already registered on-chain.\n *\n * Where {@link simpleCompute} carries the program as a URL and the input as a\n * block coordinate, this points at two `Dormant` contracts instead. Each\n * `{ ContractId: { id } }` resolves to that contract's `compute.input` — the\n * field {@link dataContract} stores an artifact in — so the program contract\n * supplies the image and the input contract supplies the data.\n *\n * Only the `input` reference is billed: settlement pays the input contract's\n * owner its `usage_price`, which is why that ID is also what\n * `estimateMinFee` needs to quote the floor.\n */\nexport async function storedCompute(params: StoredComputeParams, account: KeyringPair) {\n assert(!!params.programContractId, \"storedCompute requires a programContractId\");\n assert(!!params.inputContractId, \"storedCompute requires an inputContractId\");\n\n const plaintextCipher = \"Plaintext\";\n const computeStep = {\n cipher: plaintextCipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: { ContractId: { id: params.inputContractId } },\n program: { ContractId: { id: params.programContractId } },\n metadata: buildComputeMetadata(params.metadata),\n };\n\n const contract = {\n contractType: \"Active\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher: plaintextCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getCostEstimatorUrl } from \"../config\";\nimport { debugLog } from \"../utils\";\n\n/** Thrown for any non-2xx response from the cost estimation service. */\nexport class CostEstimationError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"CostEstimationError\";\n }\n}\n\nasync function request<T>(\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n): Promise<T> {\n const url = `${getCostEstimatorUrl()}${path}`;\n debugLog(`cost estimation service: ${method} ${url}`, body);\n\n const res = await fetch(url, {\n method,\n headers: body !== undefined ? { \"Content-Type\": \"application/json\" } : undefined,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n const text = await res.text();\n const data = text ? JSON.parse(text) : undefined;\n\n if (!res.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String((data as { error: unknown }).error)\n : `cost estimation service returned ${res.status}`;\n throw new CostEstimationError(message, res.status);\n }\n\n return data as T;\n}\n\nexport const costEstimationClient = {\n get: <T>(path: string) => request<T>(\"GET\", path),\n post: <T>(path: string, body?: unknown) => request<T>(\"POST\", path, body),\n};\n","import { costEstimationClient } from \"./client\";\nimport type {\n ContractParams,\n EstimateResult,\n EstimateStatusResponse,\n GuardianEntry,\n} from \"./types\";\n\ninterface RawGuardianEntry {\n address: string;\n pubKey: string;\n feeThreshold: string;\n}\n\ninterface RawEstimateResult {\n predictedDurationMs: number;\n auctionedRate: string;\n estimatedCost: string;\n guardians: RawGuardianEntry[];\n}\n\ntype RawEstimateStatusResponse =\n | { status: \"pending\"; auctionId: string }\n | { status: \"completed\"; auctionId: string; result: RawEstimateResult }\n | { status: \"failed\"; auctionId: string; error: string };\n\nfunction toGuardianEntry(raw: RawGuardianEntry): GuardianEntry {\n return {\n address: raw.address,\n pubKey: raw.pubKey,\n feeThreshold: BigInt(raw.feeThreshold),\n };\n}\n\nfunction toEstimateResult(raw: RawEstimateResult): EstimateResult {\n return {\n predictedDurationMs: raw.predictedDurationMs,\n auctionedRate: BigInt(raw.auctionedRate),\n estimatedCost: BigInt(raw.estimatedCost),\n guardians: raw.guardians.map(toGuardianEntry),\n };\n}\n\nfunction toEstimateStatusResponse(\n raw: RawEstimateStatusResponse,\n): EstimateStatusResponse {\n if (raw.status === \"completed\") {\n return { status: \"completed\", auctionId: raw.auctionId, result: toEstimateResult(raw.result) };\n }\n return raw;\n}\n\nexport interface StartedEstimate {\n estimateId: string;\n /**\n * Id of the auction backing this estimate. Usable with {@link getAuction} once a\n * resolved auction has dropped off `GET /auctions` / `GET /guardians/:address/auctions`\n * — most callers never need it and can just poll {@link getEstimateResult}.\n */\n auctionId: string;\n}\n\n/**\n * Starts a cost estimate via `POST /estimate`.\n *\n * Asynchronous: returns as soon as the rate auction is created, well before it\n * resolves (~`AUCTION_WINDOW_MS`, 5000ms by default). Poll {@link getEstimateResult}\n * with the returned id for the outcome, or use {@link waitForEstimate} to do both in\n * one call.\n *\n * Not idempotent — every call starts a brand-new auction with a new id, and can\n * resolve to a different `estimatedCost` even for identical input.\n *\n * @throws {CostEstimationError} 400 if `computeMode` is missing/invalid; 422 if no\n * guardians are eligible for that mode (do not tight-loop retry).\n */\nexport async function startEstimate(params: ContractParams): Promise<StartedEstimate> {\n return costEstimationClient.post<StartedEstimate>(\"/estimate\", params);\n}\n\n/**\n * Fetches the current state of an estimate started via {@link startEstimate}.\n *\n * `auctionedRate`, `estimatedCost`, and `feeThreshold` are returned as `bigint` —\n * never treat them as floating-point numbers.\n *\n * @throws {CostEstimationError} 404 if `estimateId` is unrecognized (terminal — a\n * restart of the service does not invalidate a previously issued id).\n */\nexport async function getEstimateResult(\n estimateId: string,\n): Promise<EstimateStatusResponse> {\n const raw = await costEstimationClient.get<RawEstimateStatusResponse>(\n `/estimates/${encodeURIComponent(estimateId)}`,\n );\n return toEstimateStatusResponse(raw);\n}\n\nexport interface WaitForEstimateOptions {\n /** Milliseconds between polls. Defaults to 5000ms (the service's default auction window). */\n intervalMs?: number;\n /** Upper bound on total wait time in milliseconds. Defaults to 60000ms. */\n timeoutMs?: number;\n}\n\n/**\n * Starts an estimate and polls {@link getEstimateResult} until it leaves\n * `\"pending\"`, spacing requests `intervalMs` apart rather than tight-looping.\n *\n * Resolves with the terminal `\"completed\"` or `\"failed\"` status. Rejects if\n * `timeoutMs` elapses first — the estimate keeps running server-side regardless,\n * and can still be recovered later via {@link getEstimateResult} with the same id.\n */\nexport async function waitForEstimate(\n params: ContractParams,\n options: WaitForEstimateOptions = {},\n): Promise<{ estimateId: string; status: EstimateStatusResponse }> {\n const { intervalMs = 5000, timeoutMs = 60000 } = options;\n const { estimateId } = await startEstimate(params);\n const deadline = Date.now() + timeoutMs;\n\n for (;;) {\n const status = await getEstimateResult(estimateId);\n if (status.status !== \"pending\") {\n return { estimateId, status };\n }\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error(\n `waitForEstimate: estimate ${estimateId} still pending after ${timeoutMs}ms`,\n );\n }\n await sleep(Math.min(intervalMs, remaining));\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n","import type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { u8aToHex } from \"@polkadot/util\";\nimport { costEstimationClient } from \"./client\";\nimport type { AuctionDetail, AuctionWinner, OpenAuction, ResolvedAuction } from \"./types\";\n\ninterface RawOpenAuctionsResponse {\n auctions: OpenAuction[];\n}\n\ninterface RawAuctionWinner {\n guardian: string;\n rate: string;\n}\n\ninterface RawAuctionDetail {\n auctionId: string;\n contractId: string;\n guardians: string[];\n deadline: number;\n resolved: boolean;\n winner?: RawAuctionWinner;\n}\n\ninterface RawResolvedAuctionsResponse {\n auctions: (Omit<RawAuctionDetail, \"resolved\"> & { winner: RawAuctionWinner })[];\n}\n\nfunction toAuctionWinner(raw: RawAuctionWinner): AuctionWinner {\n return { guardian: raw.guardian, rate: BigInt(raw.rate) };\n}\n\n/**\n * Lists currently open (unresolved) auctions via `GET /auctions`, so a guardian can\n * discover an `auctionId` while it is still running in the background after a\n * {@link startEstimate} call returned. Only relevant when acting on behalf of a\n * guardian — a plain cost lookup never needs this.\n */\nexport async function listOpenAuctions(): Promise<OpenAuction[]> {\n const { auctions } =\n await costEstimationClient.get<RawOpenAuctionsResponse>(\"/auctions\");\n return auctions;\n}\n\n/**\n * Same as {@link listOpenAuctions}, pre-filtered server-side (via\n * `GET /guardians/:address/auctions`) to auctions `guardianAddress` is eligible for.\n */\nexport async function listGuardianAuctions(\n guardianAddress: string,\n): Promise<OpenAuction[]> {\n const { auctions } = await costEstimationClient.get<RawOpenAuctionsResponse>(\n `/guardians/${encodeURIComponent(guardianAddress)}/auctions`,\n );\n return auctions;\n}\n\n/**\n * Looks up a single auction via `GET /auctions/:id`, regardless of resolution status.\n * A resolved auction is never deleted from the service's store, only excluded from\n * {@link listOpenAuctions} / {@link listGuardianAuctions} — this is the only way to\n * retrieve its outcome (including the winning guardian's address) once resolved.\n *\n * @throws {CostEstimationError} 404 if `auctionId` is unrecognized — terminal.\n */\nexport async function getAuction(auctionId: string): Promise<AuctionDetail> {\n const raw = await costEstimationClient.get<RawAuctionDetail>(\n `/auctions/${encodeURIComponent(auctionId)}`,\n );\n return {\n auctionId: raw.auctionId,\n contractId: raw.contractId,\n guardians: raw.guardians,\n deadline: raw.deadline,\n resolved: raw.resolved,\n winner: raw.winner ? toAuctionWinner(raw.winner) : undefined,\n };\n}\n\n/**\n * Lists auctions `guardianAddress` was eligible for and that have since resolved, via\n * `GET /guardians/:address/auctions?resolved=true`. Use this instead of\n * {@link listGuardianAuctions} (which only ever shows currently open auctions) when\n * fetching a confirmed auction for a guardian you don't already have an `auctionId`\n * for — no need to guess the guardian's `computeMode` and start a throwaway estimate.\n */\nexport async function listResolvedGuardianAuctions(\n guardianAddress: string,\n): Promise<ResolvedAuction[]> {\n const { auctions } = await costEstimationClient.get<RawResolvedAuctionsResponse>(\n `/guardians/${encodeURIComponent(guardianAddress)}/auctions?resolved=true`,\n );\n return auctions.map((a) => ({\n auctionId: a.auctionId,\n contractId: a.contractId,\n guardians: a.guardians,\n deadline: a.deadline,\n winner: toAuctionWinner(a.winner),\n }));\n}\n\n/**\n * Submits a signed rate bid into an open auction via `POST /auctions/:id/bid`,\n * signed with `guardian`'s sr25519 key over the literal string\n * `${auctionId}:${rate}`, as required by the service.\n *\n * Lowest `rate` wins; ties break by earliest submission time, then by\n * lexicographically smallest address. A guardian that never bids keeps its default\n * entry — its own on-chain threshold for the compute type this auction was opened\n * for, which reads as zero when it declared none.\n *\n * @param rate - Bid rate as a decimal-integer string, in atomic units.\n * @throws {CostEstimationError} 422 if the auction is unknown, already closed, or\n * `guardian` isn't in its eligible set — terminal, do not retry the same bid.\n */\nexport async function submitAuctionBid(\n auctionId: string,\n rate: string,\n guardian: KeyringPair,\n): Promise<void> {\n const signature = u8aToHex(guardian.sign(`${auctionId}:${rate}`));\n await costEstimationClient.post<{ status: \"accepted\" }>(\n `/auctions/${encodeURIComponent(auctionId)}/bid`,\n { guardian: guardian.address, rate, signature },\n );\n}\n","import type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { u8aToHex } from \"@polkadot/util\";\nimport { costEstimationClient } from \"./client\";\n\n/**\n * Registers a webhook URL for `guardian` via `POST /guardians/:address/webhook`, so\n * it gets a best-effort push (`{ auctionId, contractId, deadline }`) whenever it's\n * placed in a new auction, instead of polling {@link listGuardianAuctions}.\n *\n * Signed with `guardian`'s sr25519 key over the literal string `webhook:${url}`, as\n * required by the service — this binds the registration to the exact URL so it\n * can't be replayed to redirect notifications elsewhere.\n *\n * Replaces any previously registered webhook for this guardian; there is no\n * list/unregister endpoint. Delivery is best-effort and unawaited by the service —\n * a failed push is only logged server-side, never retried, so don't rely on this as\n * a substitute for polling if missing an auction would be costly.\n *\n * @throws {CostEstimationError} 400 if `url` isn't an absolute http(s) URL; 404 if\n * `guardian` has no resolvable on-chain guardian entry; 422 if the signature doesn't\n * verify.\n */\nexport async function registerGuardianWebhook(\n url: string,\n guardian: KeyringPair,\n): Promise<void> {\n const signature = u8aToHex(guardian.sign(`webhook:${url}`));\n await costEstimationClient.post<void>(\n `/guardians/${encodeURIComponent(guardian.address)}/webhook`,\n { url, signature },\n );\n}\n","import { costEstimationClient } from \"./client\";\n\n/**\n * Liveness probe via `GET /health`. Does not verify chain connectivity — a healthy\n * response does not guarantee {@link startEstimate} will succeed.\n */\nexport async function healthCheck(): Promise<boolean> {\n const { status } = await costEstimationClient.get<{ status: string }>(\"/health\");\n return status === \"ok\";\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { createAgreement, buildFee, buildComputeMetadata } from \"../compute\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount, toAtomicPaliAmount } from \"../utils/token\";\nimport { CipherSuite, OnChainRef } from \"./types\";\nimport type { Fee } from \"../chain/types\";\nimport type { StoreType } from \"../compute/agreement\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function writeMetadata(\n account: KeyringPair,\n name: string,\n description: string,\n ref: OnChainRef,\n price: bigint,\n dataType: number,\n l2Owner: string,\n groupId: string,\n) {\n const blobRef = [ref.blockNumber, ref.index];\n const encoder = new TextEncoder();\n const nameBytes = Array.from(encoder.encode(name));\n const descriptionBytes = Array.from(encoder.encode(description));\n const ownerBytes = Array.from(encoder.encode(l2Owner));\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n debugLog(`Registering metadata for ${name} at ${formatPaliAmount(price)}`);\n\n const request = api.tx.dataAvailability.daccRegisterData(\n nameBytes,\n descriptionBytes,\n blobRef,\n price,\n dataType,\n ownerBytes,\n groupId,\n );\n\n const hash = await signAndSend(request, account);\n\n debugLog(`Metadata registration transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n\n\nexport interface DataAgreementMetadata {\n name: string;\n description: string;\n /** Maps to the on-chain StoreType enum. */\n storeType: StoreType;\n /** H256 group identifier. */\n groupId: string;\n};\n\nexport interface DataAgreementParams {\n /** DA blob reference returned by submitTEData. */\n ref: OnChainRef;\n /** Guardian account IDs that participate in this agreement. */\n guardians: string[];\n /**\n * Absolute fee for the agreement. `computeRate` is omitted: this is a\n * `Dormant` contract and the compute rate only applies to `Active` contracts.\n */\n fee: Pick<Fee, \"amount\">;\n /** If provided, populates ComputeInfo.metadata in the contract. */\n metadata?: DataAgreementMetadata;\n /** Block number deadline. Defaults to 0 (no deadline). */\n deadline?: number;\n /** Trusted guardian index in the guardians list. Defaults to 0. */\n trustIndex?: number;\n /**\n * CipherSuite for the compute step input. Defaults to \"Plaintext\".\n * Pass the `cipher` from submitTEDataWithCipher for the threshold-encrypted path.\n */\n cipher?: CipherSuite;\n /**\n * CipherSuite for the agreement result. Defaults to \"Plaintext\".\n */\n resultCipher?: CipherSuite;\n}\n\nexport async function registerDataAgreement(\n account: KeyringPair,\n params: DataAgreementParams,\n) {\n debugLog(\n `Registering data agreement for DA ref ${params.ref.blockNumber}-${params.ref.index} at ${formatPaliAmount(toAtomicPaliAmount(params.fee.amount ?? \"0\"))}`,\n );\n\n const cipher = params.cipher ?? \"Plaintext\";\n const resultCipher = params.resultCipher ?? \"Plaintext\";\n const computeMetadata = buildComputeMetadata(params.metadata);\n\n const computeStep = {\n cipher,\n computerIndices: params.guardians.map((_, i) => i),\n ...buildFee(params.fee),\n deadline: params.deadline ?? 0,\n confidentiality: { Trusted: params.trustIndex ?? 0 },\n feeFunction: null,\n input: {\n ChainTransaction: {\n blockNumber: params.ref.blockNumber,\n extrinsicIndex: params.ref.index,\n },\n },\n program: {\n NativeData: \"DaFalse\",\n },\n metadata: computeMetadata,\n };\n\n const contract = {\n contractType: \"Dormant\" as const,\n guardians: params.guardians,\n preCheck: null,\n compute: computeStep,\n postCheck: null,\n resultCipher,\n };\n\n return createAgreement(contract, account);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { OnChainRef } from \"./types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function runAgent(\n account: KeyringPair,\n agentRef: OnChainRef,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n tdParams: Uint8Array,\n pkBytes: Uint8Array,\n tauParams: Uint8Array,\n baseModel: OnChainRef,\n publicKey: Uint8Array,\n guardians: Uint8Array[],\n guardian?: Uint8Array,\n agreementId?: Uint8Array,\n) {\n const agentRefTuple = [agentRef.blockNumber, agentRef.index];\n const baseModelTuple = [baseModel.blockNumber, baseModel.index];\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = api.tx.dataAvailability.daccRunAgent(\n agentRefTuple,\n Array.from(nonce),\n Array.from(ciphertext),\n guardian ? Array.from(guardian) : null,\n Array.from(tdParams),\n Array.from(pkBytes),\n Array.from(tauParams),\n baseModelTuple,\n Array.from(publicKey),\n guardians.map((g) => Array.from(g)),\n );\n\n const opts = {\n compute: {\n daType: 4,\n verification: 0,\n compute: 1,\n agreement: [agreementId]\n }\n };\n const hash = await signAndSend(request, account, opts);\n\n debugLog(`Run agent transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n","import { DEFAULT_EMPTY_PAYLOAD, getApi, signAndSend } from \"../chain\";\nimport { encrypt, gen_stretched_key, testCrypt } from \"../crypto\";\nimport {\n assert,\n debugLog,\n Hex,\n hexToUint8Array,\n uint8ArrayToBase64,\n} from \"../utils\";\nimport { OnChainRef, SubmitTEDataResult } from \"./types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function submitData(account: KeyringPair, data: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nSubmitting data with content length: ${data.length}`);\n\n const tx = api.tx.dataAvailability.submitData(data);\n const hash = await signAndSend(tx, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`Data availability transaction sent with hash: ${hash.hash}`);\n}\n\nexport async function submitTEData(\n account: KeyringPair,\n data: string,\n chosenGuardians: string[],\n tau_params: string,\n agg_key: string,\n group_pk: string,\n): Promise<OnChainRef> {\n const { encoded: encryptedKey, ikm } = testCrypt(tau_params, agg_key);\n const td_params = uint8ArrayToBase64(hexToUint8Array(encryptedKey as Hex));\n const shared_key = gen_stretched_key(hexToUint8Array(ikm as Hex));\n\n const encoder = new TextEncoder();\n const dataUint8Array = encoder.encode(data);\n const { ciphertext, nonce } = encrypt(dataUint8Array, shared_key);\n\n const modelSubmit = JSON.stringify({\n nonce: uint8ArrayToBase64(nonce),\n ciphertext: uint8ArrayToBase64(ciphertext),\n td_params,\n group_pk: Array.from(new Uint8Array(hexToUint8Array(group_pk as Hex))),\n tau_params: Array.from(new Uint8Array(hexToUint8Array(tau_params as Hex))),\n chosen_guardians: chosenGuardians,\n });\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = await api.tx.dataAvailability.submitData(modelSubmit);\n const hash = await signAndSend(request, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`TE data availability transaction sent with hash: ${hash.hash}`);\n\n return hash;\n}\n\n/**\n * Identical to submitTEData but additionally returns the populated CipherSuite\n * so callers can pass it directly to registerDataAgreement without\n * re-deriving the cipher parameters.\n */\nexport async function submitTEDataWithCipher(\n account: KeyringPair,\n data: string,\n chosenGuardians: string[],\n tau_params: string,\n agg_key: string,\n group_pk: string,\n): Promise<SubmitTEDataResult> {\n const { encoded: encryptedKey, ikm } = testCrypt(tau_params, agg_key);\n const shared_key = gen_stretched_key(hexToUint8Array(ikm as Hex));\n\n const encoder = new TextEncoder();\n const dataUint8Array = encoder.encode(data);\n const { ciphertext, nonce } = encrypt(dataUint8Array, shared_key);\n\n const ciphertextHex =\n \"0x\" +\n Array.from(ciphertext)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n const api = await getApi();\n assert(api, \"Failed to get API connection\");\n\n const request = await api.tx.dataAvailability.submitData(ciphertextHex);\n const ref = await signAndSend(request, account, DEFAULT_EMPTY_PAYLOAD);\n\n debugLog(`TE data availability transaction sent with hash: ${ref.hash}`);\n\n return {\n ref,\n cipher: {\n ThresholdHybrid: {\n thresholdParams: {\n SilentThreshold: {\n tdParams: Array.from(hexToUint8Array(encryptedKey as Hex)),\n pkBytes: Array.from(hexToUint8Array(group_pk as Hex)),\n tauParams: Array.from(hexToUint8Array(tau_params as Hex)),\n },\n },\n symmetricParams: {\n ChaCha20Poly1305: { nonce: Array.from(nonce) },\n },\n },\n },\n };\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport bs58 from \"bs58\";\nimport { getApi, getKeyring, MCryptFsWriter } from \"../chain\";\nimport { assert } from \"../utils\";\nimport { toAtomicPaliAmount } from \"../utils/token\";\nimport { UploadOptions } from \"./types\";\nimport { submitTEData, submitTEDataWithCipher } from \"./submit\";\nimport { registerDataAgreement, writeMetadata } from \"./register\";\n\nexport async function uploadData(options: UploadOptions) {\n const { name, description, price, type, guardianGroupInfo, ref, filePath } =\n options;\n\n assert(\n guardianGroupInfo.guardians &&\n guardianGroupInfo.tauParams &&\n guardianGroupInfo.aggKey &&\n guardianGroupInfo.groupPk,\n \"Guardian group info is missing required properties\",\n );\n console.log(\"Guardian group info:\", guardianGroupInfo);\n\n const account = (await getKeyring()).pairs[0];\n\n if (filePath) {\n throw new Error(\"uploadData: file path upload is not implemented\");\n } else {\n const storeType =\n type === \"model\" ? \"Model\" : type === \"agent\" ? \"Agent\" : type === \"executable\" ? \"Executable\" : \"Dataset\";\n const { ref: dataRef, cipher } = await submitTEDataWithCipher(\n account,\n ref || \"\",\n guardianGroupInfo.guardians,\n guardianGroupInfo.tauParams,\n guardianGroupInfo.aggKey,\n guardianGroupInfo.groupPk,\n );\n await registerDataAgreement(account, {\n ref: dataRef,\n guardians: guardianGroupInfo.guardians,\n fee: { amount: price },\n cipher,\n metadata: {\n name,\n description,\n storeType,\n groupId: guardianGroupInfo.groupId,\n },\n });\n }\n}\n\n/**\n * Legacy upload: uses submitTEData (returns only OnChainRef) and registers\n * the agreement with Plaintext cipher and no ComputePayload opts.\n * Kept for backward compatibility with callers that do not need cipher\n * parameters surfaced in the on-chain agreement.\n */\nexport async function uploadDataLegacy(options: Omit<UploadOptions, \"opts\">) {\n const { name, description, price, type, guardianGroupInfo, ref, filePath } =\n options;\n\n assert(\n guardianGroupInfo.guardians &&\n guardianGroupInfo.tauParams &&\n guardianGroupInfo.aggKey &&\n guardianGroupInfo.groupPk,\n \"Guardian group info is missing required properties\",\n );\n\n const account = (await getKeyring()).pairs[0];\n const ethAddress = \"\";\n const atomicPrice = toAtomicPaliAmount(price);\n\n if (type === \"dataset\" && filePath) {\n const fileContent = fs.readFileSync(filePath);\n const selectedFile = new File([fileContent], path.basename(filePath), {\n type: \"application/octet-stream\",\n lastModified: Date.now(),\n });\n\n const msCryptFsWriter = new MCryptFsWriter(\n {\n file: selectedFile,\n fileName: selectedFile.name,\n filePath: \"\",\n description,\n baseCost: atomicPrice,\n ownerL2Address: ethAddress,\n guardianInfo: guardianGroupInfo,\n },\n 500,\n await getApi(),\n account,\n );\n\n await msCryptFsWriter.writeFile();\n } else {\n const dataRef = await submitTEData(\n account,\n ref || \"\",\n guardianGroupInfo.guardians,\n guardianGroupInfo.tauParams,\n guardianGroupInfo.aggKey,\n guardianGroupInfo.groupPk,\n );\n\n const dtype = type === \"model\" ? 1 : type === \"agent\" ? 2 : type === \"executable\" ? 4 : 0;\n await writeMetadata(\n account,\n name,\n description,\n dataRef,\n BigInt(Number(price) * 10 ** 18),\n dtype,\n ethAddress,\n guardianGroupInfo.groupId,\n );\n }\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function addStake(account: KeyringPair, amountBaseUnits: bigint) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\"Using account:\", account.address, \"adding:\", formatPaliAmount(amountBaseUnits));\n\n const stakeTx = api.tx.staking.bondExtra(amountBaseUnits);\n const hash = await signAndSend(stakeTx, account);\n\n debugLog(`Stake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function joinIdleStaker(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const chillTx = api.tx.staking.chill();\n const hash = await signAndSend(chillTx, account);\n\n debugLog(\"Idle staker chill tx sent with hash:\", hash.hash);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function newStake(\n account: KeyringPair,\n amountBaseUnits: bigint,\n rewardDestination: string = \"Staked\"\n) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\n `Staking amount: ${formatPaliAmount(amountBaseUnits)} for account: ${account.address} with reward destination: ${rewardDestination}`\n );\n\n const stakeTx = api.tx.staking.bond(amountBaseUnits, rewardDestination);\n const hash = await signAndSend(stakeTx, account);\n\n debugLog(`Stake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function payoutStake(account: KeyringPair, eras: Array<number>, address?: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n for (const era of eras) {\n debugLog(\"Paying account: \", address || account.address, \" for era \", era);\n }\n\n const unstakeTxs = eras.map((era) =>\n api.tx.staking.payoutStakers(address || account.address, era)\n );\n const batchTx = api.tx.utility.batch(unstakeTxs);\n const hash = await signAndSend(batchTx, account);\n\n debugLog(`Batch payout transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function reduceStake(account: KeyringPair, amountBaseUnits: bigint) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n debugLog(\"Using account:\", account.address, \"reducing:\", formatPaliAmount(amountBaseUnits));\n\n const unstakeTx = api.tx.staking.unbond(amountBaseUnits);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function removeStake(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const stakeAmount = (await api.query.staking.ledger(account.address))?.toPrimitive() as { active?: bigint } | null;\n\n debugLog(\"Removing entire stake amount:\", formatPaliAmount(stakeAmount?.active || 0n));\n\n const unstakeTx = api.tx.staking.unbond(stakeAmount?.active || 0n);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function withdrawStake(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const unstakeTx = api.tx.staking.withdrawUnbonded(0);\n const hash = await signAndSend(unstakeTx, account);\n\n debugLog(`Unstake transaction sent with hash: ${hash.hash}`);\n}\n","import { getAuthServiceUrl, getAwsRegion, getAwsS3Bucket } from \"../config\";\nimport { StorageProvider } from \"./types\";\n\nexport class S3Provider implements StorageProvider {\n public readonly id = \"s3\";\n\n getDeterministicUrl(hash: string): string {\n return `https://${getAwsS3Bucket()}.s3.${getAwsRegion()}.amazonaws.com/Contracts/${hash}`;\n }\n\n async getUploadUrl(\n txHash: string,\n fileHash: string,\n blockNumber: number,\n expectedUrl: string,\n ): Promise<string> {\n const response = await fetch(`${getAuthServiceUrl()}/api/s3/auth`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ txHash, fileHash, blockNumber, url: expectedUrl })\n });\n\n if (!response.ok) {\n let errorMessage = response.statusText;\n try {\n const errData = await response.json();\n if (errData.error) errorMessage = errData.error;\n } catch {\n // Ignore json parse error\n }\n throw new Error(`Auth Service failed: ${errorMessage}`);\n }\n\n const { presignedUrl } = await response.json();\n if (!presignedUrl) {\n throw new Error(\"No presignedUrl returned from Auth Service\");\n }\n return presignedUrl;\n }\n\n async upload(url: string, data: Uint8Array): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: data as unknown as BodyInit\n });\n\n if (!response.ok) {\n throw new Error(`Storage Upload failed: ${response.statusText}`);\n }\n }\n}\n","import { S3Provider } from \"./s3\";\nimport { StorageProvider } from \"./types\";\n\nexport class StorageRouter {\n private providers: Map<string, StorageProvider>;\n private defaultProvider: string;\n\n constructor() {\n this.providers = new Map();\n this.register(new S3Provider());\n this.defaultProvider = \"s3\";\n }\n\n public register(provider: StorageProvider) {\n this.providers.set(provider.id, provider);\n }\n\n public getProvider(id?: string): StorageProvider {\n const targetId = id || this.defaultProvider;\n const provider = this.providers.get(targetId);\n if (!provider) {\n throw new Error(`Storage provider '${targetId}' not found`);\n }\n return provider;\n }\n}\n\nexport const storageRouter = new StorageRouter();\n","import { getApi, getKeyring, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function fundAccount(account: KeyringPair, amountBaseUnits: bigint, address?: string) {\n const addr = address ? address : account.address;\n const keyring = await getKeyring();\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nFunding account: ${addr} with amount: ${formatPaliAmount(amountBaseUnits)}`);\n\n const tx = api.tx.balances.transferKeepAlive(addr, amountBaseUnits);\n const hash = await signAndSend(tx, keyring.getPairs()[0]);\n\n debugLog(`Fund transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport { formatPaliAmount } from \"../utils/token\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function transfer(account: KeyringPair, amountBaseUnits: bigint, address: string) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`\\nTransferring funds to account: ${address} with amount: ${formatPaliAmount(amountBaseUnits)}`);\n\n const tx = api.tx.balances.transferKeepAlive(address, amountBaseUnits);\n const hash = await signAndSend(tx, account);\n\n debugLog(`Transfer transaction sent with hash: ${hash.hash}`);\n}\n","import { getApi, signAndSend } from \"../chain\";\nimport { assert, debugLog } from \"../utils\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport async function joinValidator(account: KeyringPair, commission: number) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n assert(account, \"Account not initialized\");\n\n const validateTx = api.tx.staking.validate({commission, blocked: true});\n const hash = await signAndSend(validateTx, account);\n\n debugLog(\"Validator join tx sent with hash:\", hash.hash);\n}\n","import assert from \"assert\";\nimport { getApi, signAndSend } from \"./chain\";\nimport { debugLog } from \"./utils/helper\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\n\nexport interface IdentityFields {\n\tdisplay?: string;\n}\n\nexport async function setIdentity(account: KeyringPair, { display = undefined }: IdentityFields) {\n\tconst api = await getApi();\n\n\tassert(api, \"API not initialized\");\n\n\tdebugLog(`\\nSetting identity for account: ${account.address} as ${display}`);\n\n\tconst tx = api.tx.identity.setIdentity({display: {Raw: display}});\n\tconst hash = await signAndSend(tx, account);\n\n\tdebugLog(`Set identity transaction sent with hash: ${hash.hash}`);\n}\n\n","// ---------------------------------------------------------------------------\n// IndexerClient — configurable HTTP client for the @statescan/indexer REST API\n// ---------------------------------------------------------------------------\n\nimport type { ErrorResponse } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:5020\";\n\nexport interface IndexerClientOptions {\n /** Base URL of the indexer server (default: `http://localhost:5020`). */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to the global `fetch`.\n * Useful for injecting a test double or a polyfill in older Node versions.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Lightweight wrapper around `fetch` that targets the `@statescan/indexer` REST API.\n *\n * Every public method on the domain modules receives an `IndexerClient` instance,\n * keeping configuration (base URL, custom fetch) in one place.\n *\n * @example\n * ```ts\n * import { IndexerClient } from \"@palliora.org/chainsdk\";\n *\n * const client = new IndexerClient({ baseUrl: \"https://indexer.palliora.org\" });\n * ```\n */\nexport class IndexerClient {\n readonly baseUrl: string;\n private readonly _fetch: typeof globalThis.fetch;\n\n constructor(options: IndexerClientOptions = {}) {\n // Paths already include `/api/...`, so a baseUrl of `.../api` would become\n // `/api/api/...` and 404. Strip trailing slashes and an accidental `/api` suffix.\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL)\n .replace(/\\/+$/, \"\")\n .replace(/\\/api$/i, \"\");\n this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n /**\n * Performs a GET request against the indexer and returns the parsed JSON body.\n *\n * @throws {IndexerHttpError} When the response indicates failure (`success: false`)\n * or the HTTP status is not 2xx.\n */\n async get<T>(\n path: string,\n params?: Record<string, string | number | boolean | null | undefined>,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const response = await this._fetch(url.toString(), {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n\n const raw = await response.text();\n let body: unknown;\n try {\n body = raw ? JSON.parse(raw) : null;\n } catch {\n if (!response.ok) {\n throw new IndexerHttpError(\n response.status,\n raw || response.statusText,\n );\n }\n throw new IndexerHttpError(\n response.status,\n `Invalid JSON response from ${url.toString()}: ${raw.slice(0, 120)}`,\n );\n }\n\n if (!response.ok) {\n const errBody = body as ErrorResponse;\n throw new IndexerHttpError(\n response.status,\n errBody?.message ?? response.statusText,\n );\n }\n\n return body as T;\n }\n}\n\n/**\n * Error thrown when the indexer returns a non-2xx response or an error envelope.\n */\nexport class IndexerHttpError extends Error {\n readonly statusCode: number;\n\n constructor(statusCode: number, message: string) {\n super(message);\n this.name = \"IndexerHttpError\";\n this.statusCode = statusCode;\n }\n}\n","import { StoreType } from \"../compute\";\nimport type { IndexerClient } from \"./client\";\nimport type {\n ArtefactDocument,\n ArtefactsQuery,\n ArtefactAccessQuery,\n ArtefactContractsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch all artefacts, optionally filtered by type.\n *\n * `GET /api/artefacts`\n *\n * For UI categorization by `storeType`, prefer the dedicated helpers:\n * {@link getDatasets}, {@link getModels}, {@link getAgents}, {@link getExecutables}.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filter — `storeType` / `artefactType`\n * @returns `{ success: true, data: ArtefactDocument[] }`\n */\nexport async function getArtefacts(\n client: IndexerClient,\n query?: ArtefactsQuery,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return client.get(\"/api/artefacts\", query ? { ...query } : undefined);\n}\n\n/**\n * Fetch artefacts filtered by `storeType`.\n *\n * Loads `/api/artefacts` and filters client-side so results are reliable even when\n * the indexer ignores the `storeType` query param.\n */\nexport async function getArtefactsByStoreType(\n client: IndexerClient,\n storeType: StoreType,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n const response = await getArtefacts(client);\n return {\n success: true,\n data: response.data.filter((item) => item.storeType === storeType),\n };\n}\n\n/** Fetch artefacts with `storeType: \"Dataset\"`. */\nexport async function getDatasets(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Dataset\");\n}\n\n/** Fetch artefacts with `storeType: \"Model\"`. */\nexport async function getModels(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Model\");\n}\n\n/** Fetch artefacts with `storeType: \"Agent\"`. */\nexport async function getAgents(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Agent\");\n}\n\n/** Fetch artefacts with `storeType: \"Executable\"`. */\nexport async function getExecutables(\n client: IndexerClient,\n): Promise<SuccessResponse<ArtefactDocument[]>> {\n return getArtefactsByStoreType(client, \"Executable\");\n}\n\n/**\n * Fetch a single artefact by its contract ID.\n *\n * `GET /api/artefact/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `contractId` of the artefact\n */\nexport async function getArtefact(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ArtefactDocument>> {\n return client.get(`/api/artefact/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch access records for a specific artefact.\n *\n * `GET /api/artefact/:id/access`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `contractId` of the artefact\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getArtefactAccess(\n client: IndexerClient,\n id: string,\n query?: ArtefactAccessQuery,\n): Promise<SuccessResponse<unknown[]>> {\n return client.get(\n `/api/artefact/${encodeURIComponent(id)}/access`,\n query ? { ...query } : undefined,\n );\n}\n\nfunction nestedContractId(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && \"id\" in value) {\n const id = (value as { id?: unknown }).id;\n return typeof id === \"string\" ? id : undefined;\n }\n return undefined;\n}\n\n/** True when `doc` is a compute contract that references this artefact. */\nexport function isArtefactUsage(doc: Record<string, unknown> | null | undefined, artefactId: string): boolean {\n if (!doc || doc.contractId === artefactId) return false;\n if (doc.inputContractId === artefactId) return true;\n const compute = doc.compute as Record<string, Record<string, unknown>> | undefined;\n const inputId = nestedContractId(compute?.input?.contractId);\n const programId = nestedContractId(compute?.program?.contractId);\n return inputId === artefactId || programId === artefactId;\n}\n\n/**\n * Fetch compute contracts that use this artefact as input or program.\n *\n * `GET /api/artefact/:id/contracts`\n *\n * Older indexers returned the artefact document itself. In that case this\n * helper scans `/api/artefacts` and keeps rows that reference the artefact.\n *\n * @param client Configured {@link IndexerClient}\n * @param id The artefact `contractId`\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getArtefactContracts(\n client: IndexerClient,\n id: string,\n query?: ArtefactContractsQuery,\n): Promise<SuccessResponse<unknown[]>> {\n const response = await client.get<SuccessResponse<unknown[]>>(\n `/api/artefact/${encodeURIComponent(id)}/contracts`,\n query ? { ...query } : undefined,\n );\n const list = Array.isArray(response.data) ? response.data : [];\n const usages = list.filter((item) => isArtefactUsage(item as Record<string, unknown>, id));\n if (usages.length > 0) {\n return { ...response, data: usages };\n }\n\n const looksLikeSelfOnly =\n list.length > 0 &&\n list.every((item) => (item as { contractId?: string })?.contractId === id);\n\n if (!looksLikeSelfOnly) {\n return {\n ...response,\n data: list.filter((item) => (item as { contractId?: string })?.contractId !== id),\n };\n }\n\n const artefacts = await getArtefacts(client);\n return {\n success: true,\n data: (artefacts.data || []).filter((item) =>\n isArtefactUsage(item as unknown as Record<string, unknown>, id),\n ),\n };\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n ContractDocument,\n ContractsQuery,\n ComputeDocument,\n PaginatedResponse,\n ResultDocument,\n ResultsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a paginated list of contracts.\n *\n * `GET /api/contracts`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size` (default 25)\n * @returns `{ success: true, data: ContractDocument[], total: number }`\n */\nexport async function getContracts(\n client: IndexerClient,\n query?: ContractsQuery,\n): Promise<PaginatedResponse<ContractDocument>> {\n return client.get(\"/api/contracts\", query ? { ...query } : undefined);\n}\n\n/**\n * Fetch a single contract by its ID.\n *\n * `GET /api/contract/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The contract identifier\n */\nexport async function getContract(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ContractDocument>> {\n return client.get(`/api/contract/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch compute request data for a specific contract.\n *\n * `GET /api/compute/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The contract identifier\n */\nexport async function getCompute(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ComputeDocument>> {\n return client.get(`/api/compute/${encodeURIComponent(id)}`);\n}\n\n/**\n * Fetch compute results for a contract from `palliora-compute.results`.\n *\n * `GET /api/results?contractId=`\n */\nexport async function getResults(\n client: IndexerClient,\n query: ResultsQuery,\n): Promise<SuccessResponse<ResultDocument[]>> {\n return client.get(\"/api/results\", { contractId: query.contractId });\n}\n\n/**\n * Fetch a single compute result by `resultId`.\n *\n * `GET /api/result/:id`\n */\nexport async function getResult(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ResultDocument>> {\n return client.get(`/api/result/${encodeURIComponent(id)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { BlobDocument, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a blob by its block-height ID.\n *\n * `GET /api/blob/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id Block height (integer) identifying the blob\n */\nexport async function getBlob(\n client: IndexerClient,\n id: number,\n): Promise<SuccessResponse<BlobDocument>> {\n return client.get(`/api/blob/${encodeURIComponent(String(id))}`);\n}\n","import { IndexerHttpError, type IndexerClient } from \"./client\";\nimport { getArtefact, getArtefactAccess } from \"./artefacts\";\nimport { getBlob } from \"./blobs\";\nimport { getCompute, getContract, getResults } from \"./contracts\";\nimport type {\n ArtefactDocument,\n ArtefactAccessQuery,\n ArtefactFlow,\n BlobDocument,\n ComputeDocument,\n ContractDocument,\n ContractFlow,\n ContractFlowPhase,\n ContractFlowStatus,\n ResultDocument,\n SuccessResponse,\n} from \"./types\";\n\nexport type ComputeInput = ComputeDocument | ComputeDocument[] | null | undefined;\n\nfunction computeTime(item: ComputeDocument): number {\n return item.indexer?.blockTime ?? 0;\n}\n\nfunction isComputeRequest(item: ComputeDocument): boolean {\n return Boolean(\n item.jobId ||\n item.orchestrator ||\n item.resultTx ||\n item.computeReward ||\n item.decryptionFee,\n );\n}\n\nexport function normalizeComputes(compute: ComputeInput): ComputeDocument[] {\n if (!compute) return [];\n const list = Array.isArray(compute)\n ? compute\n : Array.isArray((compute as ComputeDocument & { computes?: ComputeDocument[] }).computes)\n ? (compute as ComputeDocument & { computes: ComputeDocument[] }).computes\n : [compute];\n return [...list]\n .filter(isComputeRequest)\n .sort((a, b) => computeTime(a) - computeTime(b));\n}\n\n/**\n * Map a `palliora-compute.results` row onto the compute-request shape used by\n * session phases (jobId, orchestrator, resultTx, fees).\n */\nexport function resultToCompute(result: ResultDocument): ComputeDocument {\n const indexer = result.indexer;\n return {\n ...result,\n jobId: result.resultId,\n contractId: result.contractId,\n orchestrator: result.submitor,\n resultTx: indexer\n ? {\n blockHeight: indexer.blockHeight,\n extrinsicIndex: indexer.extrinsicIndex,\n blockHash: indexer.blockHash,\n hash: indexer.blockHash,\n }\n : { hash: result.resultId },\n computeReward: result.feeBreakdown?.submitorFee?.amount,\n fee: result.feeBreakdown?.resultFee,\n decryptionFee: result.feeBreakdown?.thresholdDecryptionFee,\n indexer,\n };\n}\n\nfunction mergeComputes(\n fromResults: ComputeDocument[],\n fromCompute: ComputeDocument[],\n): ComputeDocument[] {\n if (fromResults.length === 0) return fromCompute;\n const ids = new Set(\n fromResults.flatMap((item) => [item.jobId, item.contractId].filter(Boolean) as string[]),\n );\n const extras = fromCompute.filter(\n (item) => !ids.has(item.jobId ?? \"\") && !ids.has(item.contractId ?? \"\"),\n );\n return normalizeComputes([...fromResults, ...extras]);\n}\n\nfunction withParties(agreement: ContractDocument): ContractDocument {\n if (agreement.parties?.length) return agreement;\n const guardians = (agreement as ContractDocument & { guardians?: string[] }).guardians;\n if (Array.isArray(guardians) && guardians.length) {\n return { ...agreement, parties: guardians };\n }\n return agreement;\n}\n\nexport function deriveContractStatus(\n agreement: ContractDocument | null | undefined,\n compute: ComputeInput,\n): ContractFlowStatus | \"—\" {\n if (!agreement) return \"—\";\n const computes = normalizeComputes(compute);\n if (computes.length === 0) {\n return (agreement.responses?.length ?? 0) > 0 ? \"ACCEPTED\" : \"PENDING\";\n }\n if (computes.every((item) => !!item.resultTx)) return \"COMPLETED\";\n return \"PROCESSING\";\n}\n\nexport function buildContractPhases(\n agreement: ContractDocument | null | undefined,\n compute: ComputeInput,\n): ContractFlowPhase[] {\n const computes = normalizeComputes(compute);\n const latest = computes[computes.length - 1] ?? null;\n const settledCount = computes.filter((item) => !!item.resultTx).length;\n const status = deriveContractStatus(agreement, computes);\n const phase1Active = !!agreement;\n const phase1Complete = status === \"ACCEPTED\" || status === \"PROCESSING\" || status === \"COMPLETED\";\n const phase2Active = computes.length > 0;\n const allSettled = computes.length > 0 && settledCount === computes.length;\n const phase5Complete = status === \"COMPLETED\";\n\n const requestsJson = computes.map((item) => {\n const { _id: _ignored, ...rest } = item as ComputeDocument & { _id?: unknown };\n return rest;\n });\n\n return [\n {\n id: \"phase-1\",\n title: \"Phase 1: Contract Agreement\",\n status: agreement ? `RESPONSES (${agreement.responses?.length ?? 0})` : \"—\",\n description: \"Established once and reused by every compute request in this session.\",\n json: agreement\n ? {\n contractId: agreement.contractId,\n creator: agreement.creator,\n fee: agreement.fee,\n creationTime: agreement.creationTime,\n parties: agreement.parties,\n responses: agreement.responses,\n indexer: agreement.indexer,\n computeTx: agreement.computeTx,\n }\n : {},\n active: phase1Active,\n complete: phase1Complete,\n pending: phase1Active && !phase1Complete,\n },\n {\n id: \"phase-2\",\n title: \"Phase 2: Compute Request\",\n status: phase2Active ? `${computes.length} SUBMITTED` : \"PENDING\",\n description: \"Each iteration submits a compute request that is broadcast to all guardians.\",\n json: { requestCount: computes.length, requests: requestsJson },\n active: phase2Active,\n complete: phase2Active,\n pending: phase1Complete && !phase2Active,\n },\n {\n id: \"phase-3\",\n title: \"Phase 3: Guardian Execution\",\n status: allSettled\n ? `${settledCount}/${computes.length} RESULT_SUBMITTED`\n : phase2Active\n ? `${settledCount}/${computes.length} PROCESSING`\n : \"PENDING\",\n description: \"One guardian claims each request, executes compute, and submits the result on-chain.\",\n json: latest?.resultTx\n ? {\n jobId: latest.jobId,\n contractId: latest.contractId,\n orchestrator: latest.orchestrator,\n resultTx: latest.resultTx,\n settledCount,\n requestCount: computes.length,\n }\n : { settledCount, requestCount: computes.length },\n active: phase2Active,\n complete: allSettled,\n pending: phase2Active && !allSettled,\n },\n {\n id: \"phase-4\",\n title: \"Phase 4: Fee Distribution\",\n status: allSettled ? `${settledCount}/${computes.length} SETTLED` : phase2Active ? \"PROCESSING\" : \"PENDING\",\n description: \"Executor reward is paid per completed request. TD fee was locked once at agreement.\",\n json: allSettled\n ? {\n requestCount: computes.length,\n settledCount,\n computeReward: latest?.computeReward,\n decryptionFee: latest?.decryptionFee,\n fee: latest?.fee,\n }\n : { requestCount: computes.length, settledCount },\n active: allSettled,\n complete: allSettled,\n pending: phase2Active && !allSettled,\n },\n {\n id: \"phase-5\",\n title: \"Phase 5: Close Out\",\n status: phase5Complete ? \"SETTLED\" : phase1Complete ? \"PENDING\" : \"—\",\n description: \"User sends closeout, guardians clean up, remaining funds are refunded.\",\n json: {\n requestCount: computes.length,\n settledCount,\n finalStatus: phase5Complete ? \"SETTLED\" : status,\n },\n active: phase5Complete,\n complete: phase5Complete,\n pending: phase1Complete && !phase5Complete,\n },\n ];\n}\n\n/**\n * Fetch a compute contract, optional `/api/compute/:id` payload, and\n * `palliora-compute.results` rows, then derive session lifecycle status and\n * the five UI phases used by the explorer.\n *\n * Missing compute (`404`) or results (`404`) is treated as empty.\n */\nexport async function getContractFlow(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<ContractFlow>> {\n const [agreementResponse, compute, results] = await Promise.all([\n getContract(client, id),\n getCompute(client, id).then((response) => response.data).catch((err) => {\n if (err instanceof IndexerHttpError && err.statusCode === 404) return null;\n throw err;\n }),\n getResults(client, { contractId: id }).then((response) => response.data).catch((err) => {\n if (err instanceof IndexerHttpError && err.statusCode === 404) return [];\n throw err;\n }),\n ]);\n\n const agreement = withParties(agreementResponse.data);\n const computes = mergeComputes(\n (results ?? []).map(resultToCompute),\n normalizeComputes(compute),\n );\n const latest = computes[computes.length - 1] ?? null;\n\n return {\n success: true,\n data: {\n agreement,\n compute: latest,\n computes,\n results: results ?? [],\n status: deriveContractStatus(agreement, computes) as ContractFlowStatus,\n phases: buildContractPhases(agreement, computes),\n },\n };\n}\n\nfunction blobHeightsFromArtefact(artefact: ArtefactDocument): number[] {\n const refs = artefact.blobRefs;\n if (!Array.isArray(refs)) return [];\n const heights: number[] = [];\n for (const ref of refs) {\n const raw = Array.isArray(ref) ? ref[0] : ref;\n const height = typeof raw === \"number\" ? raw : Number(raw);\n if (Number.isFinite(height)) heights.push(height);\n }\n return heights;\n}\n\n/**\n * Fetch an artefact together with its access records and blobs.\n *\n * Missing access (`404`) becomes `[]`. Missing blobs are skipped.\n */\nexport async function getArtefactFlow(\n client: IndexerClient,\n id: string,\n accessQuery?: ArtefactAccessQuery,\n): Promise<SuccessResponse<ArtefactFlow>> {\n const artefactResponse = await getArtefact(client, id);\n const artefact = artefactResponse.data;\n\n let access: unknown[] = [];\n try {\n const accessResponse = await getArtefactAccess(client, id, accessQuery);\n access = Array.isArray(accessResponse.data) ? accessResponse.data : [];\n } catch (err) {\n if (!(err instanceof IndexerHttpError && err.statusCode === 404)) throw err;\n }\n\n const blobs: BlobDocument[] = [];\n for (const height of blobHeightsFromArtefact(artefact)) {\n try {\n const blobResponse = await getBlob(client, height);\n if (blobResponse.data) blobs.push(blobResponse.data);\n } catch (err) {\n if (err instanceof IndexerHttpError && err.statusCode === 404) continue;\n throw err;\n }\n }\n\n return {\n success: true,\n data: { artefact, access, blobs },\n };\n}\n","import type { IndexerClient } from \"./client\";\nimport type { BlocksData, BlocksQuery, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a paginated list of blocks, including chain stats.\n *\n * `GET /api/blocks`\n *\n * Response shape: `{ success: true, data: { blocks: BlockDocument[], stats? } }`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size`\n */\nexport async function getBlocks(\n\tclient: IndexerClient,\n\tquery?: BlocksQuery,\n): Promise<SuccessResponse<BlocksData>> {\n\treturn client.get(\"/api/blocks\", query ? { ...query } : undefined);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { Overview, SuccessResponse } from \"./types\";\n\n/**\n * Chain summary used by the explorer home and blocks pages.\n *\n * `GET /api/overview`\n *\n * @param client Configured {@link IndexerClient}\n */\nexport async function getOverview(\n client: IndexerClient,\n): Promise<SuccessResponse<Overview>> {\n return client.get(\"/api/overview\");\n}\n","import type { IndexerClient } from \"./client\";\nimport type { EventsData, EventsQuery, SuccessResponse } from \"./types\";\n\n/**\n * Paginated chain events, newest block first.\n *\n * `GET /api/events`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size`\n */\nexport async function getEvents(\n client: IndexerClient,\n query?: EventsQuery,\n): Promise<SuccessResponse<EventsData>> {\n return client.get(\"/api/events\", query ? { ...query } : undefined);\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n CallDocument,\n CallQuery,\n CallMetadataDocument,\n CallMetadataQuery,\n CallArgsDocument,\n CallArgsQuery,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a call by block height and extrinsic index.\n *\n * `GET /api/call`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `blockHeight` and `extrinsicIndex`\n */\nexport async function getCall(\n client: IndexerClient,\n query: CallQuery,\n): Promise<SuccessResponse<CallDocument>> {\n return client.get(\"/api/call\", { ...query });\n}\n\n/**\n * Fetch call metadata by block height and extrinsic index.\n *\n * `GET /api/call-metadata`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `blockHeight` and `extrinsicIndex`\n */\nexport async function getCallMetadata(\n client: IndexerClient,\n query: CallMetadataQuery,\n): Promise<SuccessResponse<CallMetadataDocument>> {\n return client.get(\"/api/call-metadata\", { ...query });\n}\n\n/**\n * Fetch call arguments by metadata hash.\n *\n * `GET /api/call-args`\n *\n * @param client Configured {@link IndexerClient}\n * @param query **Required** — `metadataHash`\n */\nexport async function getCallArgs(\n client: IndexerClient,\n query: CallArgsQuery,\n): Promise<SuccessResponse<CallArgsDocument>> {\n return client.get(\"/api/call-args\", { ...query });\n}\n","import type { IndexerClient } from \"./client\";\nimport type { TransferDocument, TransfersQuery, SuccessResponse } from \"./types\";\n\n/**\n * Fetch a paginated list of transfers, sorted by block height descending.\n *\n * `GET /api/transfers`\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed), `page_size`\n */\nexport async function getTransfers(\n client: IndexerClient,\n query?: TransfersQuery,\n): Promise<SuccessResponse<TransferDocument[]>> {\n return client.get(\"/api/transfers\", query ? { ...query } : undefined);\n}\n","import type { IndexerClient } from \"./client\";\nimport type {\n ExtrinsicDocument,\n ExtrinsicsQuery,\n PaginatedResponse,\n SuccessResponse,\n} from \"./types\";\n\n/**\n * Fetch a paginated list of extrinsics, sorted by block height descending.\n *\n * `GET /api/extrinsics`\n *\n * Fields `nonce`, `_id`, `tip`, and `signature` are excluded by the indexer.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Pagination — `page` (0-indexed, default 0), `page_size` (default 10, max 100);\n * `signed_only: true` filters to signed extrinsics only\n * @returns `{ success: true, data: ExtrinsicDocument[], total: number }`\n */\nexport async function getExtrinsics(\n client: IndexerClient,\n query?: ExtrinsicsQuery,\n): Promise<PaginatedResponse<ExtrinsicDocument>> {\n if (!query) {\n return client.get(\"/api/extrinsics\");\n }\n\n const { signed_only, ...rest } = query;\n const params: Record<string, string | number | boolean | undefined> = { ...rest };\n\n if (signed_only !== undefined) {\n // Indexer expects the string \"true\" / \"false\"\n params.signed_only = signed_only === true || signed_only === \"true\" ? \"true\" : \"false\";\n }\n\n return client.get(\"/api/extrinsics\", params);\n}\n\n/**\n * Fetch a single extrinsic by block index or transaction hash.\n *\n * `GET /api/extrinsic/:indexOrHash`\n *\n * Accepts either:\n * - Block index: `blockHeight-extrinsicIndex` (e.g. `\"2528092-2\"`)\n * - Transaction hash: `0x`-prefixed 64-char hex string\n *\n * @param client Configured {@link IndexerClient}\n * @param indexOrHash Block-index pair or extrinsic hash\n * @throws {IndexerHttpError} `400` for invalid id format, `404` when not found\n */\nexport async function getExtrinsic(\n client: IndexerClient,\n indexOrHash: string,\n): Promise<SuccessResponse<ExtrinsicDocument>> {\n return client.get(`/api/extrinsic/${encodeURIComponent(indexOrHash)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { AddressDocument, DataOnlyResponse } from \"./types\";\n\n/**\n * Fetch the top 50 addresses by balance.\n *\n * `GET /api/addresses`\n *\n * **Note:** This endpoint returns a raw array, not a `{ success, data }` envelope.\n *\n * @param client Configured {@link IndexerClient}\n */\nexport async function getAddresses(\n client: IndexerClient,\n): Promise<AddressDocument[]> {\n return client.get(\"/api/addresses\");\n}\n\n/**\n * Fetch a single address document.\n *\n * `GET /api/address/:address`\n *\n * **Note:** This endpoint returns `{ data }` without a `success` field.\n *\n * @param client Configured {@link IndexerClient}\n * @param address The substrate address to look up\n */\nexport async function getAddress(\n client: IndexerClient,\n address: string,\n): Promise<DataOnlyResponse<AddressDocument>> {\n return client.get(`/api/address/${encodeURIComponent(address)}`);\n}\n","import { IndexerHttpError, type IndexerClient } from \"./client\";\nimport type {\n GuardianDocument,\n GuardianGroupDocument,\n GuardianGroupsQuery,\n SuccessResponse,\n} from \"./types\";\n\nfunction displayNameForAccount(\n groups: GuardianGroupDocument[],\n account: string,\n): string | null {\n for (const group of groups) {\n const addresses = group.guardians ?? [];\n const names = group.guardianNames ?? [];\n const index = addresses.indexOf(account);\n if (index === -1) continue;\n const rawName = names[index];\n if (typeof rawName === \"string\" && rawName.length > 0) return rawName;\n }\n return null;\n}\n\nfunction uniqueGuardians(groups: GuardianGroupDocument[]): GuardianDocument[] {\n const seen = new Map<string, string | null>();\n for (const group of groups) {\n const addresses = group.guardians ?? [];\n const names = group.guardianNames ?? [];\n for (let i = 0; i < addresses.length; i++) {\n const account = addresses[i];\n if (!account || seen.has(account)) continue;\n const rawName = names[i];\n seen.set(account, typeof rawName === \"string\" && rawName.length > 0 ? rawName : null);\n }\n }\n return Array.from(seen, ([account, displayName]) => ({ account, displayName }));\n}\n\nasync function guardianGroupsOrEmpty(\n client: IndexerClient,\n query?: GuardianGroupsQuery,\n): Promise<GuardianGroupDocument[]> {\n try {\n const response = await getGuardianGroups(client, query);\n return response.data ?? [];\n } catch (err) {\n if (err instanceof IndexerHttpError && err.statusCode === 404) {\n return [];\n }\n throw err;\n }\n}\n\n/**\n * Fetch guardian groups, optionally filtered by guardian address.\n * Results are deduplicated and enriched with identity names.\n *\n * `GET /api/guardian-groups`\n *\n * Each group includes `guardians: string[]` and a parallel `guardianNames`\n * array (`string | null`) from the identity database.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filter — `guardian` address\n */\nexport async function getGuardianGroups(\n client: IndexerClient,\n query?: GuardianGroupsQuery,\n): Promise<SuccessResponse<GuardianGroupDocument[]>> {\n return client.get(\"/api/guardian-groups\", query ? { ...query } : undefined);\n}\n\n/**\n * Flatten identity-enriched guardian groups into a unique list of guardians.\n *\n * Derived from {@link getGuardianGroups}; there is no separate `/api/guardians`\n * endpoint. A 404 (no groups) returns an empty list.\n *\n * @returns `{ success: true, data: GuardianDocument[] }`\n * where each item is `{ account, displayName }`.\n */\nexport async function getGuardians(\n client: IndexerClient,\n): Promise<SuccessResponse<GuardianDocument[]>> {\n const groups = await guardianGroupsOrEmpty(client);\n return { success: true, data: uniqueGuardians(groups) };\n}\n\n/**\n * Fetch identity for a single guardian account.\n *\n * Uses `GET /api/guardian-groups?guardian=<account>` and returns\n * `{ account, displayName }`. `displayName` is `null` when the account has\n * no identity or is not in any indexed group.\n */\nexport async function getGuardian(\n client: IndexerClient,\n account: string,\n): Promise<SuccessResponse<GuardianDocument>> {\n const groups = await guardianGroupsOrEmpty(client, { guardian: account });\n return {\n success: true,\n data: {\n account,\n displayName: displayNameForAccount(groups, account),\n },\n };\n}\n\n/**\n * Fetch a single guardian group by its group ID.\n *\n * `GET /api/guardian-group/:id`\n *\n * @param client Configured {@link IndexerClient}\n * @param id The `groupId`\n */\nexport async function getGuardianGroup(\n client: IndexerClient,\n id: string,\n): Promise<SuccessResponse<GuardianGroupDocument>> {\n return client.get(`/api/guardian-group/${encodeURIComponent(id)}`);\n}\n","import type { IndexerClient } from \"./client\";\nimport type { AccessDocument, AccessQuery, AccessResponse } from \"./types\";\n\n/**\n * Fetch access records from the **legacy** statescan-polkadot-data database.\n *\n * `GET /api/access`\n *\n * > **Deprecated** — superseded by `getArtefactAccess`. Kept for backward compatibility.\n *\n * @param client Configured {@link IndexerClient}\n * @param query Optional filters — `blockHeight`, `extrinsicIndex`, `retriver`\n */\nexport async function getAccess(\n client: IndexerClient,\n query?: AccessQuery,\n): Promise<AccessResponse<AccessDocument>> {\n return client.get(\"/api/access\", query ? { ...query } : undefined);\n}\n","import { getApi, signAndSend } from \"./chain\";\nimport bs58 from 'bs58';\nimport { debugLog } from \"./utils/helper\";\nimport assert from \"assert\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport { getProvider } from \"./config\";\n\nexport async function rotateAndSetKeys(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n debugLog(`Rotating session keys for ${account.meta.name} on ${getProvider().endpoint}`);\n\n const newKeys = await api.rpc.author.rotateKeys();\n debugLog(`${account.meta.name} rotated keys on ${getProvider().endpoint}:`, newKeys?.toHex?.() ?? newKeys);\n\n const setKeysTx = api.tx.session.setKeys(newKeys, []);\n const hash = await signAndSend(setKeysTx, account);\n\n debugLog(`Rotate session transaction sent with hash: ${hash.hash}`);\n}\n\nexport async function setWorker(account: KeyringPair) {\n const api = await getApi();\n\n assert(api, \"API not initialized\");\n\n const peerid = bs58.decode((await api.rpc.system.localPeerId()).toString());\n const setWorkerTx = api.tx.guardian.setWorker(peerid.slice(6, 38));\n const hash = await signAndSend(setWorkerTx, account);\n\n debugLog(`Set worker id transaction sent with hash: ${hash.hash}`);\n}","export * from \"./account\";\nexport * from \"./chain\";\nexport * from \"./compute\";\nexport * from \"./costEstimation\";\nexport * from \"./crypto\";\nexport * from \"./da\";\nexport * from \"./guardian\";\nexport * from \"./stake\";\nexport * from \"./storage\";\nexport * from \"./token\";\nexport * from \"./utils/helper\";\nexport * from \"./utils/token\";\nexport * from \"./validator\";\nexport * from \"./config\";\nexport * from \"./identity\";\nexport * from \"./indexer\";\nexport * from \"./rotateKeys\";\n\nexport * from \"@polkadot/util\";\nexport * as utilCrypto from \"@polkadot/util-crypto\";\nexport * as wasmCrypto from \"@polkadot/wasm-crypto\";\nexport { ApiPromise, WsProvider, HttpProvider } from \"@polkadot/api\";\nexport { Keyring } from \"@polkadot/keyring\";\nexport type { KeyringPair } from \"@polkadot/keyring/types\";\n","export { decodeAddress, encodeAddress, setSS58Format } from '@polkadot/util-crypto';\nexport { Keyring } from './keyring.js';\nexport { packageInfo } from './packageInfo.js';\nexport { createPair } from './pair/index.js';\nexport { createTestKeyring } from './testing.js';\nexport { createTestPairs } from './testingPairs.js';\nexport * from './defaults.js';\n","import { hexToU8a, isHex, stringToU8a } from '@polkadot/util';\nimport { base64Decode, decodeAddress, ed25519PairFromSeed as ed25519FromSeed, encodeAddress, ethereumEncode, hdEthereum, keyExtractSuri, keyFromPath, mnemonicToLegacySeed, mnemonicToMiniSecret, secp256k1PairFromSeed as secp256k1FromSeed, sr25519PairFromSeed as sr25519FromSeed } from '@polkadot/util-crypto';\nimport { createPair } from './pair/index.js';\nimport { DEV_PHRASE } from './defaults.js';\nimport { Pairs } from './pairs.js';\nconst PairFromSeed = {\n ecdsa: (seed) => secp256k1FromSeed(seed),\n ed25519: (seed) => ed25519FromSeed(seed),\n ethereum: (seed) => secp256k1FromSeed(seed),\n sr25519: (seed) => sr25519FromSeed(seed)\n};\nfunction pairToPublic({ publicKey }) {\n return publicKey;\n}\n/**\n * # @polkadot/keyring\n *\n * ## Overview\n *\n * @name Keyring\n * @summary Keyring management of user accounts\n * @description Allows generation of keyring pairs from a variety of input combinations, such as\n * json object containing account address or public key, account metadata, and account encoded using\n * `addFromJson`, or by providing those values as arguments separately to `addFromAddress`,\n * or by providing the mnemonic (seed phrase) and account metadata as arguments to `addFromMnemonic`.\n * Stores the keyring pairs in a keyring pair dictionary. Removal of the keyring pairs from the keyring pair\n * dictionary is achieved using `removePair`. Retrieval of all the stored pairs via `getPairs` or perform\n * lookup of a pair for a given account address or public key using `getPair`. JSON metadata associated with\n * an account may be obtained using `toJson` accompanied by the account passphrase.\n */\nexport class Keyring {\n #pairs;\n #type;\n #ss58;\n decodeAddress = decodeAddress;\n constructor(options = {}) {\n options.type = options.type || 'ed25519';\n if (!['ecdsa', 'ethereum', 'ed25519', 'sr25519'].includes(options.type || 'undefined')) {\n throw new Error(`Expected a keyring type of either 'ed25519', 'sr25519', 'ethereum' or 'ecdsa', found '${options.type || 'unknown'}`);\n }\n this.#pairs = new Pairs();\n this.#ss58 = options.ss58Format;\n this.#type = options.type;\n }\n /**\n * @description retrieve the pairs (alias for getPairs)\n */\n get pairs() {\n return this.getPairs();\n }\n /**\n * @description retrieve the publicKeys (alias for getPublicKeys)\n */\n get publicKeys() {\n return this.getPublicKeys();\n }\n /**\n * @description Returns the type of the keyring, ed25519, sr25519 or ecdsa\n */\n get type() {\n return this.#type;\n }\n /**\n * @name addPair\n * @summary Stores an account, given a keyring pair, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n */\n addPair(pair) {\n return this.#pairs.add(pair);\n }\n /**\n * @name addFromAddress\n * @summary Stores an account, given an account address, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to explicitly provide separate inputs including account address or public key, and optionally\n * the associated account metadata, and the default encoded value as arguments (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from them that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromAddress(address, meta = {}, encoded = null, type = this.type, ignoreChecksum, encType) {\n const publicKey = this.decodeAddress(address, ignoreChecksum);\n return this.addPair(createPair({ toSS58: this.encodeAddress, type }, { publicKey, secretKey: new Uint8Array() }, meta, encoded, encType));\n }\n /**\n * @name addFromJson\n * @summary Stores an account, given JSON data, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to provide a json object argument that contains account information (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from it that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromJson(json, ignoreChecksum) {\n return this.addPair(this.createFromJson(json, ignoreChecksum));\n }\n /**\n * @name addFromMnemonic\n * @summary Stores an account, given a mnemonic, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Allows user to provide a mnemonic (seed phrase that is provided when account is originally created)\n * argument and a metadata argument that contains account information (that may be obtained from the json file\n * of an account backup), and then generates a keyring pair from it that it passes to\n * `addPair` to stores in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromMnemonic(mnemonic, meta = {}, type = this.type, wordlist) {\n return this.addFromUri(mnemonic, meta, type, wordlist);\n }\n /**\n * @name addFromPair\n * @summary Stores an account created from an explicit publicKey/secreteKey combination\n */\n addFromPair(pair, meta = {}, type = this.type) {\n return this.addPair(this.createFromPair(pair, meta, type));\n }\n /**\n * @name addFromSeed\n * @summary Stores an account, given seed data, as a Key/Value (public key, pair) in Keyring Pair Dictionary\n * @description Stores in a keyring pair dictionary the public key of the pair as a key and the pair as the associated value.\n * Allows user to provide the account seed as an argument, and then generates a keyring pair from it that it passes to\n * `addPair` to store in a keyring pair dictionary the public key of the generated pair as a key and the pair as the associated value.\n */\n addFromSeed(seed, meta = {}, type = this.type) {\n return this.addPair(createPair({ toSS58: this.encodeAddress, type }, PairFromSeed[type](seed), meta, null));\n }\n /**\n * @name addFromUri\n * @summary Creates an account via an suri\n * @description Extracts the phrase, path and password from a SURI format for specifying secret keys `<secret>/<soft-key>//<hard-key>///<password>` (the `///password` may be omitted, and `/<soft-key>` and `//<hard-key>` maybe repeated and mixed). The secret can be a hex string, mnemonic phrase or a string (to be padded)\n */\n addFromUri(suri, meta = {}, type = this.type, wordlist) {\n return this.addPair(this.createFromUri(suri, meta, type, wordlist));\n }\n /**\n * @name createFromJson\n * @description Creates a pair from a JSON keyfile\n */\n createFromJson({ address, encoded, encoding: { content, type, version }, meta }, ignoreChecksum) {\n if (version === '3' && content[0] !== 'pkcs8') {\n throw new Error(`Unable to decode non-pkcs8 type, [${content.join(',')}] found}`);\n }\n const cryptoType = version === '0' || !Array.isArray(content)\n ? this.type\n : content[1];\n const encType = !Array.isArray(type)\n ? [type]\n : type;\n if (!['ed25519', 'sr25519', 'ecdsa', 'ethereum'].includes(cryptoType)) {\n throw new Error(`Unknown crypto type ${cryptoType}`);\n }\n // Here the address and publicKey are 32 bytes and isomorphic. This is why the address field needs to be the public key for ethereum type pairs\n const publicKey = isHex(address)\n ? hexToU8a(address)\n : this.decodeAddress(address, ignoreChecksum);\n const decoded = isHex(encoded)\n ? hexToU8a(encoded)\n : base64Decode(encoded);\n return createPair({ toSS58: this.encodeAddress, type: cryptoType }, { publicKey, secretKey: new Uint8Array() }, meta, decoded, encType);\n }\n /**\n * @name createFromPair\n * @summary Creates a pair from an explicit publicKey/secreteKey combination\n */\n createFromPair(pair, meta = {}, type = this.type) {\n return createPair({ toSS58: this.encodeAddress, type }, pair, meta, null);\n }\n /**\n * @name createFromUri\n * @summary Creates a Keypair from an suri\n * @description This creates a pair from the suri, but does not add it to the keyring\n */\n createFromUri(_suri, meta = {}, type = this.type, wordlist) {\n // here we only aut-add the dev phrase if we have a hard-derived path\n const suri = _suri.startsWith('//')\n ? `${DEV_PHRASE}${_suri}`\n : _suri;\n const { derivePath, password, path, phrase } = keyExtractSuri(suri);\n let seed;\n const isPhraseHex = isHex(phrase, 256);\n if (isPhraseHex) {\n seed = hexToU8a(phrase);\n }\n else {\n const parts = phrase.split(' ');\n if ([12, 15, 18, 21, 24].includes(parts.length)) {\n seed = type === 'ethereum'\n ? mnemonicToLegacySeed(phrase, '', false, 64)\n : mnemonicToMiniSecret(phrase, password, wordlist);\n }\n else {\n if (phrase.length > 32) {\n throw new Error('specified phrase is not a valid mnemonic and is invalid as a raw seed at > 32 bytes');\n }\n seed = stringToU8a(phrase.padEnd(32));\n }\n }\n const derived = type === 'ethereum'\n ? isPhraseHex\n ? PairFromSeed[type](seed) // for eth, if the private key is provided as suri, it must be derived only once\n : hdEthereum(seed, derivePath.substring(1))\n : keyFromPath(PairFromSeed[type](seed), path, type);\n return createPair({ toSS58: this.encodeAddress, type }, derived, meta, null);\n }\n /**\n * @name encodeAddress\n * @description Encodes the input into an ss58 representation\n */\n encodeAddress = (address, ss58Format) => {\n return this.type === 'ethereum'\n ? ethereumEncode(address)\n : encodeAddress(address, ss58Format ?? this.#ss58);\n };\n /**\n * @name getPair\n * @summary Retrieves an account keyring pair from the Keyring Pair Dictionary, given an account address\n * @description Returns a keyring pair value from the keyring pair dictionary by performing\n * a key lookup using the provided account address or public key (after decoding it).\n */\n getPair(address) {\n return this.#pairs.get(address);\n }\n /**\n * @name getPairs\n * @summary Retrieves all account keyring pairs from the Keyring Pair Dictionary\n * @description Returns an array list of all the keyring pair values that are stored in the keyring pair dictionary.\n */\n getPairs() {\n return this.#pairs.all();\n }\n /**\n * @name getPublicKeys\n * @summary Retrieves Public Keys of all Keyring Pairs stored in the Keyring Pair Dictionary\n * @description Returns an array list of all the public keys associated with each of the keyring pair values that are stored in the keyring pair dictionary.\n */\n getPublicKeys() {\n return this.#pairs.all().map(pairToPublic);\n }\n /**\n * @name removePair\n * @description Deletes the provided input address or public key from the stored Keyring Pair Dictionary.\n */\n removePair(address) {\n this.#pairs.remove(address);\n }\n /**\n * @name setSS58Format;\n * @description Sets the ss58 format for the keyring\n */\n setSS58Format(ss58) {\n this.#ss58 = ss58;\n }\n /**\n * @name toJson\n * @summary Returns a JSON object associated with the input argument that contains metadata assocated with an account\n * @description Returns a JSON object containing the metadata associated with an account\n * when valid address or public key and when the account passphrase is provided if the account secret\n * is not already unlocked and available in memory. Note that in [Polkadot-JS Apps](https://github.com/polkadot-js/apps) the user\n * may backup their account to a JSON file that contains this information.\n */\n toJson(address, passphrase) {\n return this.#pairs.get(address).toJson(passphrase);\n }\n}\n","import { objectSpread, u8aConcat, u8aEmpty, u8aEq, u8aToHex, u8aToU8a } from '@polkadot/util';\nimport { blake2AsU8a, ed25519PairFromSeed as ed25519FromSeed, ed25519Sign, ethereumEncode, keccakAsU8a, keyExtractPath, keyFromPath, secp256k1Compress, secp256k1Expand, secp256k1PairFromSeed as secp256k1FromSeed, secp256k1Sign, signatureVerify, sr25519PairFromSeed as sr25519FromSeed, sr25519Sign, sr25519VrfSign, sr25519VrfVerify } from '@polkadot/util-crypto';\nimport { decodePair } from './decode.js';\nimport { encodePair } from './encode.js';\nimport { pairToJson } from './toJson.js';\nconst SIG_TYPE_NONE = new Uint8Array();\nconst TYPE_FROM_SEED = {\n ecdsa: secp256k1FromSeed,\n ed25519: ed25519FromSeed,\n ethereum: secp256k1FromSeed,\n sr25519: sr25519FromSeed\n};\nconst TYPE_PREFIX = {\n ecdsa: new Uint8Array([2]),\n ed25519: new Uint8Array([0]),\n ethereum: new Uint8Array([2]),\n sr25519: new Uint8Array([1])\n};\nconst TYPE_SIGNATURE = {\n ecdsa: (m, p) => secp256k1Sign(m, p, 'blake2'),\n ed25519: ed25519Sign,\n ethereum: (m, p) => secp256k1Sign(m, p, 'keccak'),\n sr25519: sr25519Sign\n};\nconst TYPE_ADDRESS = {\n ecdsa: (p) => p.length > 32 ? blake2AsU8a(p) : p,\n ed25519: (p) => p,\n ethereum: (p) => p.length === 20 ? p : keccakAsU8a(secp256k1Expand(p)),\n sr25519: (p) => p\n};\nfunction isLocked(secretKey) {\n return !secretKey || u8aEmpty(secretKey);\n}\nfunction vrfHash(proof, context, extra) {\n return blake2AsU8a(u8aConcat(context || '', extra || '', proof));\n}\n/**\n * @name createPair\n * @summary Creates a keyring pair object\n * @description Creates a keyring pair object with provided account public key, metadata, and encoded arguments.\n * The keyring pair stores the account state including the encoded address and associated metadata.\n *\n * It has properties whose values are functions that may be called to perform account actions:\n *\n * - `address` function retrieves the address associated with the account.\n * - `decodedPkcs8` function is called with the account passphrase and account encoded public key.\n * It decodes the encoded public key using the passphrase provided to obtain the decoded account public key\n * and associated secret key that are then available in memory, and changes the account address stored in the\n * state of the pair to correspond to the address of the decoded public key.\n * - `encodePkcs8` function when provided with the correct passphrase associated with the account pair\n * and when the secret key is in memory (when the account pair is not locked) it returns an encoded\n * public key of the account.\n * - `meta` is the metadata that is stored in the state of the pair, either when it was originally\n * created or set via `setMeta`.\n * - `publicKey` returns the public key stored in memory for the pair.\n * - `sign` may be used to return a signature by signing a provided message with the secret\n * key (if it is in memory) using Nacl.\n * - `toJson` calls another `toJson` function and provides the state of the pair,\n * it generates arguments to be passed to the other `toJson` function including an encoded public key of the account\n * that it generates using the secret key from memory (if it has been made available in memory)\n * and the optionally provided passphrase argument. It passes a third boolean argument to `toJson`\n * indicating whether the public key has been encoded or not (if a passphrase argument was provided then it is encoded).\n * The `toJson` function that it calls returns a JSON object with properties including the `address`\n * and `meta` that are assigned with the values stored in the corresponding state variables of the account pair,\n * an `encoded` property that is assigned with the encoded public key in hex format, and an `encoding`\n * property that indicates whether the public key value of the `encoded` property is encoded or not.\n */\nexport function createPair({ toSS58, type }, { publicKey, secretKey }, meta = {}, encoded = null, encTypes) {\n const decodePkcs8 = (passphrase, userEncoded) => {\n const decoded = decodePair(passphrase, userEncoded || encoded, encTypes);\n if (decoded.secretKey.length === 64) {\n publicKey = decoded.publicKey;\n secretKey = decoded.secretKey;\n }\n else {\n const pair = TYPE_FROM_SEED[type](decoded.secretKey);\n publicKey = pair.publicKey;\n secretKey = pair.secretKey;\n }\n };\n const recode = (passphrase) => {\n isLocked(secretKey) && encoded && decodePkcs8(passphrase, encoded);\n encoded = encodePair({ publicKey, secretKey }, passphrase); // re-encode, latest version\n encTypes = undefined; // swap to defaults, latest version follows\n return encoded;\n };\n const encodeAddress = () => {\n const raw = TYPE_ADDRESS[type](publicKey);\n return type === 'ethereum'\n ? ethereumEncode(raw)\n : toSS58(raw);\n };\n return {\n get address() {\n return encodeAddress();\n },\n get addressRaw() {\n const raw = TYPE_ADDRESS[type](publicKey);\n return type === 'ethereum'\n ? raw.slice(-20)\n : raw;\n },\n get isLocked() {\n return isLocked(secretKey);\n },\n get meta() {\n return meta;\n },\n get publicKey() {\n return publicKey;\n },\n get type() {\n return type;\n },\n // eslint-disable-next-line sort-keys\n decodePkcs8,\n derive: (suri, meta) => {\n if (type === 'ethereum') {\n throw new Error('Unable to derive on this keypair');\n }\n else if (isLocked(secretKey)) {\n throw new Error('Cannot derive on a locked keypair');\n }\n const { path } = keyExtractPath(suri);\n const derived = keyFromPath({ publicKey, secretKey }, path, type);\n return createPair({ toSS58, type }, derived, meta, null);\n },\n encodePkcs8: (passphrase) => {\n return recode(passphrase);\n },\n lock: () => {\n secretKey = new Uint8Array();\n },\n setMeta: (additional) => {\n meta = objectSpread({}, meta, additional);\n },\n sign: (message, options = {}) => {\n if (isLocked(secretKey)) {\n throw new Error('Cannot sign with a locked key pair');\n }\n return u8aConcat(options.withType\n ? TYPE_PREFIX[type]\n : SIG_TYPE_NONE, TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey }));\n },\n toJson: (passphrase) => {\n // NOTE: For ecdsa and ethereum, the publicKey cannot be extracted from the address. For these\n // pass the hex-encoded publicKey through to the address portion of the JSON (before decoding)\n // unless the publicKey is already an address\n const address = ['ecdsa', 'ethereum'].includes(type)\n ? publicKey.length === 20\n ? u8aToHex(publicKey)\n : u8aToHex(secp256k1Compress(publicKey))\n : encodeAddress();\n return pairToJson(type, { address, meta }, recode(passphrase), !!passphrase);\n },\n unlock: (passphrase) => {\n return decodePkcs8(passphrase);\n },\n verify: (message, signature, signerPublic) => {\n return signatureVerify(message, signature, TYPE_ADDRESS[type](u8aToU8a(signerPublic))).isValid;\n },\n vrfSign: (message, context, extra) => {\n if (isLocked(secretKey)) {\n throw new Error('Cannot sign with a locked key pair');\n }\n if (type === 'sr25519') {\n return sr25519VrfSign(message, { secretKey }, context, extra);\n }\n const proof = TYPE_SIGNATURE[type](u8aToU8a(message), { publicKey, secretKey });\n return u8aConcat(vrfHash(proof, context, extra), proof);\n },\n vrfVerify: (message, vrfResult, signerPublic, context, extra) => {\n if (type === 'sr25519') {\n return sr25519VrfVerify(message, vrfResult, publicKey, context, extra);\n }\n const result = signatureVerify(message, u8aConcat(TYPE_PREFIX[type], vrfResult.subarray(32)), TYPE_ADDRESS[type](u8aToU8a(signerPublic)));\n return result.isValid && u8aEq(vrfResult.subarray(0, 32), vrfHash(vrfResult.subarray(32), context, extra));\n }\n };\n}\n","import { u8aEq } from '@polkadot/util';\nimport { jsonDecryptData } from '@polkadot/util-crypto';\nimport { PAIR_DIV, PAIR_HDR, PUB_LENGTH, SEC_LENGTH, SEED_LENGTH } from './defaults.js';\nconst SEED_OFFSET = PAIR_HDR.length;\n/**\n * Decode a pair, taking into account the generation-specific formats and headers\n *\n * For divisor/headers, don't rely on the magic being static. These will\n * change between generations, aka with the long-awaited 4th generation\n * of the format. The external decode interface is the only way to use and decode these.\n **/\nexport function decodePair(passphrase, encrypted, _encType) {\n const encType = Array.isArray(_encType) || _encType === undefined\n ? _encType\n : [_encType];\n const decrypted = jsonDecryptData(encrypted, passphrase, encType);\n const header = decrypted.subarray(0, PAIR_HDR.length);\n // check the start header (generations 1-3)\n if (!u8aEq(header, PAIR_HDR)) {\n throw new Error('Invalid encoding header found in body');\n }\n // setup for generation 3 format\n let secretKey = decrypted.subarray(SEED_OFFSET, SEED_OFFSET + SEC_LENGTH);\n let divOffset = SEED_OFFSET + SEC_LENGTH;\n let divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);\n // old-style (generation 1 & 2), we have the seed here\n if (!u8aEq(divider, PAIR_DIV)) {\n divOffset = SEED_OFFSET + SEED_LENGTH;\n secretKey = decrypted.subarray(SEED_OFFSET, divOffset);\n divider = decrypted.subarray(divOffset, divOffset + PAIR_DIV.length);\n // check the divisior at this point (already checked for generation 3)\n if (!u8aEq(divider, PAIR_DIV)) {\n throw new Error('Invalid encoding divider found in body');\n }\n }\n const pubOffset = divOffset + PAIR_DIV.length;\n const publicKey = decrypted.subarray(pubOffset, pubOffset + PUB_LENGTH);\n return {\n publicKey,\n secretKey\n };\n}\n","/** public/secret section divider (generation 1-3, will change in 4, don't rely on value) */\nexport const PAIR_DIV = new Uint8Array([161, 35, 3, 33, 0]);\n/** public/secret start block (generation 1-3, will change in 4, don't rely on value) */\nexport const PAIR_HDR = new Uint8Array([48, 83, 2, 1, 1, 48, 5, 6, 3, 43, 101, 112, 4, 34, 4, 32]);\n/** length of a public key */\nexport const PUB_LENGTH = 32;\n/** length of a salt */\nexport const SALT_LENGTH = 32;\n/** length of a secret key */\nexport const SEC_LENGTH = 64;\n/** length of a user-input seed */\nexport const SEED_LENGTH = 32;\n","import { u8aConcat } from '@polkadot/util';\nimport { naclEncrypt, scryptEncode, scryptToU8a } from '@polkadot/util-crypto';\nimport { PAIR_DIV, PAIR_HDR } from './defaults.js';\n/**\n * Encode a pair with the latest generation format (generation 3)\n **/\nexport function encodePair({ publicKey, secretKey }, passphrase) {\n if (!secretKey) {\n throw new Error('Expected a valid secretKey to be passed to encode');\n }\n const encoded = u8aConcat(PAIR_HDR, secretKey, PAIR_DIV, publicKey);\n if (!passphrase) {\n return encoded;\n }\n // this is only for generation 3 (previous generations are only handled in decoding)\n const { params, password, salt } = scryptEncode(passphrase);\n const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));\n return u8aConcat(scryptToU8a(salt, params), nonce, encrypted);\n}\n","import { objectSpread } from '@polkadot/util';\nimport { jsonEncryptFormat } from '@polkadot/util-crypto';\nexport function pairToJson(type, { address, meta }, encoded, isEncrypted) {\n return objectSpread(jsonEncryptFormat(encoded, ['pkcs8', type], isEncrypted), {\n address,\n meta\n });\n}\n","export const DEV_PHRASE = 'bottom drive obey lake curtain smoke basket hold race lonely fit walk';\nexport const DEV_SEED = '0xfac7959dbfe72f052e5a0c3c8d6530f202b02fd8f9f5ca3580ec8deb7797479e';\n","import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util';\nimport { decodeAddress } from '@polkadot/util-crypto';\nexport class Pairs {\n #map = {};\n add(pair) {\n this.#map[decodeAddress(pair.address).toString()] = pair;\n return pair;\n }\n all() {\n return Object.values(this.#map);\n }\n get(address) {\n const pair = this.#map[decodeAddress(address).toString()];\n if (!pair) {\n throw new Error(`Unable to retrieve keypair '${isU8a(address) || isHex(address)\n ? u8aToHex(u8aToU8a(address))\n : address}'`);\n }\n return pair;\n }\n remove(address) {\n delete this.#map[decodeAddress(address).toString()];\n }\n}\n"],"mappings":"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","names":["CryptoType","AccountSourceType","keyring","encrypt","Keyring","waitReady","waitReady","Keyring","isFunction","waitReady","api","waitReady","api","block","ext","api","request","api","isFunction","getBlock","api","getFileMetadataCall","request","encrypt","waitReady","waitReady","api","api","api","api","keyring","api","edwardsToMontgomeryPub","api","encrypt","edwardsToMontgomeryPub","bs58","api","bs58","path","u8aToHex","u8aToHex","api","request","api","request","api","encrypt","request","api","api","api","api","api","api","api","keyring","api","api","api","assert","api","assert","path","bs58","assert","api","assert","bs58","ApiPromise","WsProvider","decodeAddress","encodeAddress","hexToU8a","isHex","decodeAddress","ed25519FromSeed","ethereumEncode","keyFromPath","secp256k1FromSeed","sr25519FromSeed","objectSpread","u8aConcat","u8aEq","u8aToHex","u8aConcat","encodeAddress","meta","path","objectSpread","u8aToHex","u8aEq","u8aToHex","u8aToU8a","u8aToHex","u8aToU8a","secp256k1FromSeed","ed25519FromSeed","sr25519FromSeed","Keyring","decodeAddress","ethereumEncode","isHex","hexToU8a","path","keyFromPath"]}