Skip to content

Commit

Permalink
Merge pull request #195 from blockfrost/srk/plutusV3CostModels
Browse files Browse the repository at this point in the history
fix: plutus V3 cost model mapping
  • Loading branch information
slowbackspace authored Aug 22, 2024
2 parents a54513b + 10db230 commit fd2c03f
Show file tree
Hide file tree
Showing 3 changed files with 541 additions and 1 deletion.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed

- Plutus V3 cost model mapping

## [2.1.0] - 2024-07-31

### Added
Expand Down
269 changes: 268 additions & 1 deletion src/utils/cost-models-map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,261 @@ const plutusV2Names: Array<string> = [
'verifySchnorrSecp256k1Signature-memory-arguments',
];

// https://github.com/IntersectMBO/plutus/blob/ffe41b864ea018e188ab9e0295cf6ad7e180844a/plutus-ledger-api/src/PlutusLedgerApi/V3/ParamName.hs#L17
const plutusV3Names: Array<string> = [
'addInteger-cpu-arguments-intercept',
'addInteger-cpu-arguments-slope',
'addInteger-memory-arguments-intercept',
'addInteger-memory-arguments-slope',
'appendByteString-cpu-arguments-intercept',
'appendByteString-cpu-arguments-slope',
'appendByteString-memory-arguments-intercept',
'appendByteString-memory-arguments-slope',
'appendString-cpu-arguments-intercept',
'appendString-cpu-arguments-slope',
'appendString-memory-arguments-intercept',
'appendString-memory-arguments-slope',
'bData-cpu-arguments',
'bData-memory-arguments',
'blake2b_256-cpu-arguments-intercept',
'blake2b_256-cpu-arguments-slope',
'blake2b_256-memory-arguments',
'cekApplyCost-exBudgetCPU',
'cekApplyCost-exBudgetMemory',
'cekBuiltinCost-exBudgetCPU',
'cekBuiltinCost-exBudgetMemory',
'cekConstCost-exBudgetCPU',
'cekConstCost-exBudgetMemory',
'cekDelayCost-exBudgetCPU',
'cekDelayCost-exBudgetMemory',
'cekForceCost-exBudgetCPU',
'cekForceCost-exBudgetMemory',
'cekLamCost-exBudgetCPU',
'cekLamCost-exBudgetMemory',
'cekStartupCost-exBudgetCPU',
'cekStartupCost-exBudgetMemory',
'cekVarCost-exBudgetCPU',
'cekVarCost-exBudgetMemory',
'chooseData-cpu-arguments',
'chooseData-memory-arguments',
'chooseList-cpu-arguments',
'chooseList-memory-arguments',
'chooseUnit-cpu-arguments',
'chooseUnit-memory-arguments',
'consByteString-cpu-arguments-intercept',
'consByteString-cpu-arguments-slope',
'consByteString-memory-arguments-intercept',
'consByteString-memory-arguments-slope',
'constrData-cpu-arguments',
'constrData-memory-arguments',
'decodeUtf8-cpu-arguments-intercept',
'decodeUtf8-cpu-arguments-slope',
'decodeUtf8-memory-arguments-intercept',
'decodeUtf8-memory-arguments-slope',
'divideInteger-cpu-arguments-constant',
'divideInteger-cpu-arguments-model-arguments-c00',
'divideInteger-cpu-arguments-model-arguments-c01',
'divideInteger-cpu-arguments-model-arguments-c02',
'divideInteger-cpu-arguments-model-arguments-c10',
'divideInteger-cpu-arguments-model-arguments-c11',
'divideInteger-cpu-arguments-model-arguments-c20',
'divideInteger-cpu-arguments-model-arguments-minimum',
'divideInteger-memory-arguments-intercept',
'divideInteger-memory-arguments-minimum',
'divideInteger-memory-arguments-slope',
'encodeUtf8-cpu-arguments-intercept',
'encodeUtf8-cpu-arguments-slope',
'encodeUtf8-memory-arguments-intercept',
'encodeUtf8-memory-arguments-slope',
'equalsByteString-cpu-arguments-constant',
'equalsByteString-cpu-arguments-intercept',
'equalsByteString-cpu-arguments-slope',
'equalsByteString-memory-arguments',
'equalsData-cpu-arguments-intercept',
'equalsData-cpu-arguments-slope',
'equalsData-memory-arguments',
'equalsInteger-cpu-arguments-intercept',
'equalsInteger-cpu-arguments-slope',
'equalsInteger-memory-arguments',
'equalsString-cpu-arguments-constant',
'equalsString-cpu-arguments-intercept',
'equalsString-cpu-arguments-slope',
'equalsString-memory-arguments',
'fstPair-cpu-arguments',
'fstPair-memory-arguments',
'headList-cpu-arguments',
'headList-memory-arguments',
'iData-cpu-arguments',
'iData-memory-arguments',
'ifThenElse-cpu-arguments',
'ifThenElse-memory-arguments',
'indexByteString-cpu-arguments',
'indexByteString-memory-arguments',
'lengthOfByteString-cpu-arguments',
'lengthOfByteString-memory-arguments',
'lessThanByteString-cpu-arguments-intercept',
'lessThanByteString-cpu-arguments-slope',
'lessThanByteString-memory-arguments',
'lessThanEqualsByteString-cpu-arguments-intercept',
'lessThanEqualsByteString-cpu-arguments-slope',
'lessThanEqualsByteString-memory-arguments',
'lessThanEqualsInteger-cpu-arguments-intercept',
'lessThanEqualsInteger-cpu-arguments-slope',
'lessThanEqualsInteger-memory-arguments',
'lessThanInteger-cpu-arguments-intercept',
'lessThanInteger-cpu-arguments-slope',
'lessThanInteger-memory-arguments',
'listData-cpu-arguments',
'listData-memory-arguments',
'mapData-cpu-arguments',
'mapData-memory-arguments',
'mkCons-cpu-arguments',
'mkCons-memory-arguments',
'mkNilData-cpu-arguments',
'mkNilData-memory-arguments',
'mkNilPairData-cpu-arguments',
'mkNilPairData-memory-arguments',
'mkPairData-cpu-arguments',
'mkPairData-memory-arguments',
'modInteger-cpu-arguments-constant',
'modInteger-cpu-arguments-model-arguments-c00',
'modInteger-cpu-arguments-model-arguments-c01',
'modInteger-cpu-arguments-model-arguments-c02',
'modInteger-cpu-arguments-model-arguments-c10',
'modInteger-cpu-arguments-model-arguments-c11',
'modInteger-cpu-arguments-model-arguments-c20',
'modInteger-cpu-arguments-model-arguments-minimum',
'modInteger-memory-arguments-intercept',
'modInteger-memory-arguments-slope',
'multiplyInteger-cpu-arguments-intercept',
'multiplyInteger-cpu-arguments-slope',
'multiplyInteger-memory-arguments-intercept',
'multiplyInteger-memory-arguments-slope',
'nullList-cpu-arguments',
'nullList-memory-arguments',
'quotientInteger-cpu-arguments-constant',
'quotientInteger-cpu-arguments-model-arguments-c00',
'quotientInteger-cpu-arguments-model-arguments-c01',
'quotientInteger-cpu-arguments-model-arguments-c02',
'quotientInteger-cpu-arguments-model-arguments-c10',
'quotientInteger-cpu-arguments-model-arguments-c11',
'quotientInteger-cpu-arguments-model-arguments-c20',
'quotientInteger-cpu-arguments-model-arguments-minimum',
'quotientInteger-memory-arguments-intercept',
'quotientInteger-memory-arguments-slope',
'remainderInteger-cpu-arguments-constant',
'remainderInteger-cpu-arguments-model-arguments-c00',
'remainderInteger-cpu-arguments-model-arguments-c01',
'remainderInteger-cpu-arguments-model-arguments-c02',
'remainderInteger-cpu-arguments-model-arguments-c10',
'remainderInteger-cpu-arguments-model-arguments-c11',
'remainderInteger-cpu-arguments-model-arguments-c20',
'remainderInteger-cpu-arguments-model-arguments-minimum',
'remainderInteger-memory-arguments-intercept',
'remainderInteger-memory-arguments-minimum',
'remainderInteger-memory-arguments-slope',
'serialiseData-cpu-arguments-intercept',
'serialiseData-cpu-arguments-slope',
'serialiseData-memory-arguments-intercept',
'serialiseData-memory-arguments-slope',
'sha2_256-cpu-arguments-intercept',
'sha2_256-cpu-arguments-slope',
'sha2_256-memory-arguments',
'sha3_256-cpu-arguments-intercept',
'sha3_256-cpu-arguments-slope',
'sha3_256-memory-arguments',
'sliceByteString-cpu-arguments-intercept',
'sliceByteString-cpu-arguments-slope',
'sliceByteString-memory-arguments-intercept',
'sliceByteString-memory-arguments-slope',
'sndPair-cpu-arguments',
'sndPair-memory-arguments',
'subtractInteger-cpu-arguments-intercept',
'subtractInteger-cpu-arguments-slope',
'subtractInteger-memory-arguments-intercept',
'subtractInteger-memory-arguments-slope',
'tailList-cpu-arguments',
'tailList-memory-arguments',
'trace-cpu-arguments',
'trace-memory-arguments',
'unBData-cpu-arguments',
'unBData-memory-arguments',
'unConstrData-cpu-arguments',
'unConstrData-memory-arguments',
'unIData-cpu-arguments',
'unIData-memory-arguments',
'unListData-cpu-arguments',
'unListData-memory-arguments',
'unMapData-cpu-arguments',
'unMapData-memory-arguments',
'verifyEcdsaSecp256k1Signature-cpu-arguments',
'verifyEcdsaSecp256k1Signature-memory-arguments',
'verifyEd25519Signature-cpu-arguments-intercept',
'verifyEd25519Signature-cpu-arguments-slope',
'verifyEd25519Signature-memory-arguments',
'verifySchnorrSecp256k1Signature-cpu-arguments-intercept',
'verifySchnorrSecp256k1Signature-cpu-arguments-slope',
'verifySchnorrSecp256k1Signature-memory-arguments',
'cekConstrCost-exBudgetCPU',
'cekConstrCost-exBudgetMemory',
'cekCaseCost-exBudgetCPU',
'cekCaseCost-exBudgetMemory',
'bls12_381_G1_add-cpu-arguments',
'bls12_381_G1_add-memory-arguments',
'bls12_381_G1_compress-cpu-arguments',
'bls12_381_G1_compress-memory-arguments',
'bls12_381_G1_equal-cpu-arguments',
'bls12_381_G1_equal-memory-arguments',
'bls12_381_G1_hashToGroup-cpu-arguments-intercept',
'bls12_381_G1_hashToGroup-cpu-arguments-slope',
'bls12_381_G1_hashToGroup-memory-arguments',
'bls12_381_G1_neg-cpu-arguments',
'bls12_381_G1_neg-memory-arguments',
'bls12_381_G1_scalarMul-cpu-arguments-intercept',
'bls12_381_G1_scalarMul-cpu-arguments-slope',
'bls12_381_G1_scalarMul-memory-arguments',
'bls12_381_G1_uncompress-cpu-arguments',
'bls12_381_G1_uncompress-memory-arguments',
'bls12_381_G2_add-cpu-arguments',
'bls12_381_G2_add-memory-arguments',
'bls12_381_G2_compress-cpu-arguments',
'bls12_381_G2_compress-memory-arguments',
'bls12_381_G2_equal-cpu-arguments',
'bls12_381_G2_equal-memory-arguments',
'bls12_381_G2_hashToGroup-cpu-arguments-intercept',
'bls12_381_G2_hashToGroup-cpu-arguments-slope',
'bls12_381_G2_hashToGroup-memory-arguments',
'bls12_381_G2_neg-cpu-arguments',
'bls12_381_G2_neg-memory-arguments',
'bls12_381_G2_scalarMul-cpu-arguments-intercept',
'bls12_381_G2_scalarMul-cpu-arguments-slope',
'bls12_381_G2_scalarMul-memory-arguments',
'bls12_381_G2_uncompress-cpu-arguments',
'bls12_381_G2_uncompress-memory-arguments',
'bls12_381_finalVerify-cpu-arguments',
'bls12_381_finalVerify-memory-arguments',
'bls12_381_millerLoop-cpu-arguments',
'bls12_381_millerLoop-memory-arguments',
'bls12_381_mulMlResult-cpu-arguments',
'bls12_381_mulMlResult-memory-arguments',
'keccak_256-cpu-arguments-intercept',
'keccak_256-cpu-arguments-slope',
'keccak_256-memory-arguments',
'blake2b_224-cpu-arguments-intercept',
'blake2b_224-cpu-arguments-slope',
'blake2b_224-memory-arguments',
'integerToByteString-cpu-arguments-c0',
'integerToByteString-cpu-arguments-c1',
'integerToByteString-cpu-arguments-c2',
'integerToByteString-memory-arguments-intercept',
'integerToByteString-memory-arguments-slope',
'byteStringToInteger-cpu-arguments-c0',
'byteStringToInteger-cpu-arguments-c1',
'byteStringToInteger-cpu-arguments-c2',
'byteStringToInteger-memory-arguments-intercept',
'byteStringToInteger-memory-arguments-slope',
];

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const costModelsMap = (costModels: any) => {
if (costModels === null || typeof costModels !== 'object') return null;
Expand All @@ -363,7 +618,10 @@ export const costModelsMap = (costModels: any) => {
throw new Error('The size of the Plutus V1 cost model mismatched');

if ('PlutusV2' in costModels && Object.keys(costModels.PlutusV2).length !== plutusV2Names.length)
throw new Error('The size of the Plutus V1 cost model mismatched');
throw new Error('The size of the Plutus V2 cost model mismatched');

if ('PlutusV3' in costModels && Object.keys(costModels.PlutusV3).length !== plutusV3Names.length)
throw new Error('The size of the Plutus V3 cost model mismatched');

if ('PlutusV1' in costModels && validation.isNumber(Object.keys(costModels.PlutusV1)[0])) {
const PlutusV1: Record<string, number> = {};
Expand All @@ -383,5 +641,14 @@ export const costModelsMap = (costModels: any) => {
costModels = { ...costModels, PlutusV2 };
}

if ('PlutusV3' in costModels && validation.isNumber(Object.keys(costModels.PlutusV3)[0])) {
const PlutusV3: Record<string, number> = {};

for (let index = 0; index < plutusV3Names.length; index++)
PlutusV3[plutusV3Names[index]] = costModels.PlutusV3[index];

costModels = { ...costModels, PlutusV3 };
}

return costModels;
};
Loading

0 comments on commit fd2c03f

Please sign in to comment.