fix: add error throwing on too large fungible post-condition

This commit is contained in:
janniks
2024-01-02 17:20:57 +01:00
committed by janniks
parent 2eabcf7737
commit d0a1a32bc6
3 changed files with 40 additions and 9 deletions

View File

@@ -1,23 +1,21 @@
import { IntegerType, intToBigInt } from '@stacks/common';
import { ClarityValue } from './clarity';
import {
PostConditionType,
FungibleConditionCode,
NonFungibleConditionCode,
PostConditionType,
StacksMessageType,
} from './constants';
import {
AssetInfo,
PostConditionPrincipal,
parseAssetInfoString,
parsePrincipalString,
STXPostCondition,
FungiblePostCondition,
NonFungiblePostCondition,
PostConditionPrincipal,
STXPostCondition,
parseAssetInfoString,
parsePrincipalString,
} from './postcondition-types';
import { ClarityValue } from './clarity';
export function createSTXPostCondition(
principal: string | PostConditionPrincipal,
conditionCode: FungibleConditionCode,

View File

@@ -42,7 +42,7 @@ import {
createLPString,
} from './postcondition-types';
import { Payload, deserializePayload, serializePayload } from './payload';
import { DeserializationError } from './errors';
import { DeserializationError, SerializationError } from './errors';
import {
deserializeTransactionAuthField,
deserializeMessageSignature,
@@ -379,6 +379,9 @@ export function serializePostCondition(postCondition: PostCondition): Uint8Array
postCondition.conditionType === PostConditionType.STX ||
postCondition.conditionType === PostConditionType.Fungible
) {
// SIP-005: Maximal length of amount is 8 bytes
if (postCondition.amount > BigInt('0xffffffffffffffff'))
throw new SerializationError('The post-condition amount may not be larger than 8 bytes');
bytesArray.push(intToBytes(postCondition.amount, false, 8));
}

View File

@@ -84,6 +84,11 @@ import { createTransactionAuthField } from '../src/signature';
import { TransactionSigner } from '../src/signer';
import { deserializeTransaction, StacksTransaction } from '../src/transaction';
import { cloneDeep } from '../src/utils';
import {
createFungiblePostCondition,
createSTXPostCondition,
serializePostCondition,
} from '../src';
function setSignature(
unsignedTransaction: StacksTransaction,
@@ -2157,3 +2162,28 @@ test('Get contract map entry - no match', async () => {
expect(result).toEqual(mockResult);
expect(result.type).toBe(ClarityType.OptionalNone);
});
test('Post-conditions with amount larger than 8 bytes throw an error', () => {
const amount = BigInt('0xffffffffffffffff') + 1n;
const stxPc = createSTXPostCondition(
'SP34EBMKMRR6SXX65GRKJ1FHEXV7AGHJ2D8ASQ5M3',
FungibleConditionCode.Equal,
amount
);
const fungiblePc = createFungiblePostCondition(
'SP34EBMKMRR6SXX65GRKJ1FHEXV7AGHJ2D8ASQ5M3',
FungibleConditionCode.Equal,
amount,
'SP34EBMKMRR6SXX65GRKJ1FHEXV7AGHJ2D8ASQ5M3.token::frank'
);
expect(() => {
serializePostCondition(stxPc);
}).toThrowError('The post-condition amount may not be larger than 8 bytes');
expect(() => {
serializePostCondition(fungiblePc);
}).toThrowError('The post-condition amount may not be larger than 8 bytes');
});