diff --git a/packages/graph-node/src/loader.ts b/packages/graph-node/src/loader.ts index a2eaa14d..253d0e80 100644 --- a/packages/graph-node/src/loader.ts +++ b/packages/graph-node/src/loader.ts @@ -478,7 +478,23 @@ export const instantiate = async ( return powResultBigDecimal; }, + 'bigDecimal.equals': async (x: number, y: number) => { + // Create decimal x string. + const xBigDecimal = await BigDecimal.wrap(x); + const xStringPtr = await xBigDecimal.toString(); + const xDecimalString = __getString(xStringPtr); + const xDecimal = new GraphDecimal(xDecimalString); + // Create decimal y string. + const yBigDecimal = await BigDecimal.wrap(y); + const yStringPtr = await yBigDecimal.toString(); + const yDecimalString = __getString(yStringPtr); + + // Perform the decimal equal operation. + const isEqual = xDecimal.equals(yDecimalString); + + return isEqual; + }, 'bigInt.fromString': async (s: number) => { const string = __getString(s); diff --git a/packages/graph-node/src/numbers.test.ts b/packages/graph-node/src/numbers.test.ts index 4a88e8fa..c6aba198 100644 --- a/packages/graph-node/src/numbers.test.ts +++ b/packages/graph-node/src/numbers.test.ts @@ -638,4 +638,22 @@ describe('numbers wasm tests', () => { expect(__getString(ptr)).to.equal(expected); }); }); + + describe('should execute bigDecimal equals API', () => { + let testBigDecimalEquals: any, __newString: any; + + before(() => { + ({ testBigDecimalEquals, __newString } = exports); + }); + + it('should check given bigDecimals are equal', async () => { + const ptr = await testBigDecimalEquals(await __newString('231543212.2132354'), await __newString('231543212.2132354')); + expect(Boolean(ptr)).to.equal(true); + }); + + it('should check given bigDecimals are not equal', async () => { + const ptr = await testBigDecimalEquals(await __newString('231543212.2132354'), await __newString('54652.65645')); + expect(Boolean(ptr)).to.equal(false); + }); + }); }); diff --git a/packages/graph-node/test/subgraph/example1/src/mapping.ts b/packages/graph-node/test/subgraph/example1/src/mapping.ts index cfd01d39..8f2f6c09 100644 --- a/packages/graph-node/test/subgraph/example1/src/mapping.ts +++ b/packages/graph-node/test/subgraph/example1/src/mapping.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { Address, log, BigInt, BigDecimal, ByteArray, dataSource, ethereum, Bytes, crypto, json, JSONValueKind } from '@graphprotocol/graph-ts'; +import { Address, log, BigInt, BigDecimal, bigDecimal, ByteArray, dataSource, ethereum, Bytes, crypto, json, JSONValueKind } from '@graphprotocol/graph-ts'; import { Example1, @@ -299,6 +299,15 @@ export function testBigDecimalTimes (value1: string, value2: string): string { return res.toString(); } +export function testBigDecimalEquals (value1: string, value2: string): boolean { + log.debug('In test bigDecimal.equals', []); + + const bigDecimal1 = bigDecimal.fromString(value1); + const bigDecimal2 = bigDecimal.fromString(value2); + + return bigDecimal1.equals(bigDecimal2); +} + export function testBigIntPlus (value1: string, value2: string): string { log.debug('In test bigInt.plus', []); diff --git a/packages/util/src/graph/graph-decimal.ts b/packages/util/src/graph/graph-decimal.ts index e2a08674..03c7af81 100644 --- a/packages/util/src/graph/graph-decimal.ts +++ b/packages/util/src/graph/graph-decimal.ts @@ -151,6 +151,13 @@ export class GraphDecimal { return this.value.cmp(param); } + equals (n: Decimal.Value | GraphDecimal): boolean { + this._checkOutOfRange(this); + const param = this._checkOutOfRange(n); + + return this.value.equals(param); + } + /** * Function to check and throw an error if a given value has exponent out of the specified range (MIN_EXP to MAX_EXP). * @param n A Decimal value to check the range for.