diff --git a/packages/sdk/src/asset-config.test.ts b/packages/sdk/src/asset-config.test.ts index d3c5e9e..b303345 100644 --- a/packages/sdk/src/asset-config.test.ts +++ b/packages/sdk/src/asset-config.test.ts @@ -19,6 +19,18 @@ describe("validateAssetConfig - valid fixtures", () => { assert.equal(result.decimals, 7); }); + it("accepts native config with boundary 0 decimals", () => { + const result = validateAssetConfig({ type: "native", decimals: 0 }); + assert.equal(result.type, "native"); + assert.equal(result.decimals, 0); + }); + + it("accepts native config with boundary 7 decimals", () => { + const result = validateAssetConfig({ type: "native", decimals: 7 }); + assert.equal(result.type, "native"); + assert.equal(result.decimals, 7); + }); + it("accepts full SAC USDC config", () => { const result = validateAssetConfig(ASSET_FIXTURES.valid.sac); assert.equal(result.type, "sac"); @@ -35,6 +47,26 @@ describe("validateAssetConfig - valid fixtures", () => { assert.equal(result.code, undefined); }); + it("accepts SAC config with boundary 0 decimals", () => { + const result = validateAssetConfig({ + type: "sac", + contractId: ASSET_FIXTURES.valid.sacMinimal.contractId, + decimals: 0, + }); + assert.equal(result.type, "sac"); + assert.equal(result.decimals, 0); + }); + + it("accepts SAC config with boundary 18 decimals", () => { + const result = validateAssetConfig({ + type: "sac", + contractId: ASSET_FIXTURES.valid.sacMinimal.contractId, + decimals: 18, + }); + assert.equal(result.type, "sac"); + assert.equal(result.decimals, 18); + }); + it("accepts SAC config with metadata", () => { const result = validateAssetConfig(ASSET_FIXTURES.valid.sacWithMetadata); assert.equal(result.type, "sac"); @@ -90,6 +122,28 @@ describe("validateAssetConfig - invalid fixtures", () => { ); }); + it("rejects native decimals exceeding MAX_STROOPS_DECIMALS", () => { + assert.throws( + () => validateAssetConfig(ASSET_FIXTURES.invalid.nativeInvalidDecimals), + (e: AssetConfigError) => { + assert.equal(e.field, "decimals"); + assert.match(e.message, /decimals must be 0-7/); + return true; + }, + ); + }); + + it("rejects native negative decimals", () => { + assert.throws( + () => validateAssetConfig({ type: "native", decimals: -1 }), + (e: AssetConfigError) => { + assert.equal(e.field, "decimals"); + assert.match(e.message, /decimals must be 0-7/); + return true; + }, + ); + }); + it("rejects decimals exceeding MAX_TOKEN_DECIMALS", () => { assert.throws( () => validateAssetConfig(ASSET_FIXTURES.invalid.invalidDecimals), diff --git a/packages/sdk/src/asset-config.ts b/packages/sdk/src/asset-config.ts index de6ee03..be44851 100644 --- a/packages/sdk/src/asset-config.ts +++ b/packages/sdk/src/asset-config.ts @@ -128,10 +128,12 @@ export function validateAssetConfig( const decimals = validateNumber(raw.decimals, "decimals"); if (decimals !== undefined) { - if (decimals < 0 || decimals > MAX_TOKEN_DECIMALS) { + const maxDecimals = + type === "native" ? MAX_STROOPS_DECIMALS : MAX_TOKEN_DECIMALS; + if (decimals < 0 || decimals > maxDecimals) { throw new AssetConfigError( "decimals", - `decimals must be 0-${MAX_TOKEN_DECIMALS}, got ${decimals}`, + `decimals must be 0-${maxDecimals}, got ${decimals}`, ); } config.decimals = decimals; @@ -214,6 +216,10 @@ export const ASSET_FIXTURES = { contractId: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", decimals: 255, }, + nativeInvalidDecimals: { + type: "native", + decimals: 8, + }, negativeDecimals: { type: "sac", contractId: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4",