Skip to content

Commit

Permalink
fix: Added nativescript checks for ownSignatureKeyPaths
Browse files Browse the repository at this point in the history
  • Loading branch information
Riley-Kilgore committed Feb 17, 2025
1 parent d0e939e commit f855e12
Showing 1 changed file with 76 additions and 2 deletions.
78 changes: 76 additions & 2 deletions packages/key-management/src/util/ownSignatureKeyPaths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,78 @@ const getRequiredSignersKeyPaths = (
return paths;
};

const checkStakeCredential = (
address: GroupedAddress,
keyHash: Crypto.Ed25519KeyHashHex,
paths: AccountKeyDerivationPath[]
) => {
if (
address.stakeKeyDerivationPath &&
Cardano.RewardAccount.toHash(address.rewardAccount) === Crypto.Hash28ByteBase16.fromEd25519KeyHashHex(keyHash)
) {
paths.push(address.stakeKeyDerivationPath);
}
};

const checkPaymentCredential = (
address: GroupedAddress,
keyHash: Crypto.Ed25519KeyHashHex,
paths: AccountKeyDerivationPath[]
) => {
const paymentCredential = Cardano.Address.fromBech32(address.address)?.asBase()?.getPaymentCredential();
if (
paymentCredential?.type === Cardano.CredentialType.KeyHash &&
paymentCredential.hash === Crypto.Hash28ByteBase16.fromEd25519KeyHashHex(keyHash)
) {
paths.push({ index: address.index, role: Number(address.type) });
}
};

const processSignatureScript = (
script: Cardano.RequireSignatureScript,
groupedAddresses: GroupedAddress[],
paths: AccountKeyDerivationPath[]
) => {
for (const address of groupedAddresses) {
checkStakeCredential(address, script.keyHash, paths);
checkPaymentCredential(address, script.keyHash, paths);
}
};

const getNativeScriptKeyPaths = (
groupedAddresses: GroupedAddress[],
nativeScripts: Cardano.Script[]
): AccountKeyDerivationPath[] => {
const paths: AccountKeyDerivationPath[] = [];

const processScript = (script: Cardano.Script) => {
if (!Cardano.isNativeScript(script)) {
return;
}

switch (script.kind) {
case Cardano.NativeScriptKind.RequireSignature:
processSignatureScript(script as Cardano.RequireSignatureScript, groupedAddresses, paths);
break;
case Cardano.NativeScriptKind.RequireAllOf:
case Cardano.NativeScriptKind.RequireAnyOf:
case Cardano.NativeScriptKind.RequireNOf:
for (const subScript of (script as Cardano.RequireAllOfScript | Cardano.RequireAnyOfScript).scripts) {
processScript(subScript);
}
break;
case Cardano.NativeScriptKind.RequireTimeBefore:
case Cardano.NativeScriptKind.RequireTimeAfter:
break;
}
};

for (const script of nativeScripts) {
processScript(script);
}
return paths;
};

/** Check if there are certificates that require DRep credentials and if we own them */
export const getDRepCredentialKeyPaths = ({
dRepKeyHash,
Expand Down Expand Up @@ -357,7 +429,8 @@ export const ownSignatureKeyPaths = (
txBody: Cardano.TxBody,
knownAddresses: GroupedAddress[],
txInKeyPathMap: TxInKeyPathMap,
dRepKeyHash?: Crypto.Ed25519KeyHashHex
dRepKeyHash?: Crypto.Ed25519KeyHashHex,
witnessSet?: Cardano.Witness
): AccountKeyDerivationPath[] => {
// TODO: add `proposal_procedure` witnesses.

Expand All @@ -368,7 +441,8 @@ export const ownSignatureKeyPaths = (
...getStakeCredentialKeyPaths(knownAddresses, txBody).derivationPaths,
...getDRepCredentialKeyPaths({ dRepKeyHash, txBody }).derivationPaths,
...getRequiredSignersKeyPaths(knownAddresses, txBody.requiredExtraSignatures),
...getVotingProcedureKeyPaths({ dRepKeyHash, groupedAddresses: knownAddresses, txBody }).derivationPaths
...getVotingProcedureKeyPaths({ dRepKeyHash, groupedAddresses: knownAddresses, txBody }).derivationPaths,
...(witnessSet?.scripts ? getNativeScriptKeyPaths(knownAddresses, witnessSet.scripts) : [])
],
isEqual
);
Expand Down

0 comments on commit f855e12

Please sign in to comment.