mirror of
https://github.com/alexgo-io/stacks.js.git
synced 2026-01-12 09:34:05 +08:00
fix: add error throwing on too large fungible post-condition
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user