From fa4c759b2e41ef3b66ec43ab1a3df88aaabb6734 Mon Sep 17 00:00:00 2001 From: Jan Nanista Date: Tue, 5 Dec 2023 12:14:56 -0800 Subject: [PATCH] chore: Add schemas for working with bigints of all kinds --- packages/utils-evm/package.json | 7 ++-- packages/utils-evm/src/index.ts | 1 + packages/utils-evm/src/schema.ts | 6 ++++ packages/utils-evm/test/schema.test.ts | 44 ++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 packages/utils-evm/src/schema.ts create mode 100644 packages/utils-evm/test/schema.test.ts diff --git a/packages/utils-evm/package.json b/packages/utils-evm/package.json index ec5d1f33a..c1ab10df3 100644 --- a/packages/utils-evm/package.json +++ b/packages/utils-evm/package.json @@ -41,6 +41,7 @@ "devDependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.0", "@layerzerolabs/lz-definitions": "~1.5.68", @@ -53,7 +54,8 @@ "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "tsup": "~8.0.1", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "zod": "^3.22.4" }, "peerDependencies": { "@ethersproject/abstract-provider": "^5.7.0", @@ -62,6 +64,7 @@ "@ethersproject/providers": "^5.7.0", "@layerzerolabs/lz-definitions": "~1.5.67", "@layerzerolabs/ua-utils": "~0.1.0", - "@layerzerolabs/utils": "~0.0.1" + "@layerzerolabs/utils": "~0.0.1", + "zod": "^3.22.4" } } \ No newline at end of file diff --git a/packages/utils-evm/src/index.ts b/packages/utils-evm/src/index.ts index a4a1506fc..e922e191b 100644 --- a/packages/utils-evm/src/index.ts +++ b/packages/utils-evm/src/index.ts @@ -1,4 +1,5 @@ export * from './address' export * from './omnigraph' export * from './provider' +export * from './schema' export * from './signer' diff --git a/packages/utils-evm/src/schema.ts b/packages/utils-evm/src/schema.ts new file mode 100644 index 000000000..a4082c1ee --- /dev/null +++ b/packages/utils-evm/src/schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod' +import { BigNumber, BigNumberish, isBigNumberish } from '@ethersproject/bignumber/lib/bignumber' + +export const BigNumberishSchema = z.custom((value: unknown) => isBigNumberish(value)) + +export const BigNumberishBigintSchema = BigNumberishSchema.transform(BigNumber.from).transform((bn) => bn.toBigInt()) diff --git a/packages/utils-evm/test/schema.test.ts b/packages/utils-evm/test/schema.test.ts new file mode 100644 index 000000000..e485a0ff0 --- /dev/null +++ b/packages/utils-evm/test/schema.test.ts @@ -0,0 +1,44 @@ +import fc from 'fast-check' +import { AddressZero } from '@ethersproject/constants' +import { evmAddressArbitrary } from '@layerzerolabs/test-utils' +import { ignoreZero, makeZero } from '@/address' +import { BigNumber, BigNumberish } from '@ethersproject/bignumber' +import { BigNumberishBigintSchema, BigNumberishSchema } from '@/schema' + +describe('schema', () => { + const bigIntArbitrary = fc.bigInt() + const uintArbitrary = fc.integer({ min: 0 }) + const bigIntStringArbitrary = bigIntArbitrary.map(String) + const bigNumberArbitrary = bigIntStringArbitrary.map(BigNumber.from) + const bytesArbitrary = fc.array(fc.integer({ min: 0, max: 255 }), { minLength: 1 }) + const bigNumberishArbitrary: fc.Arbitrary = fc.oneof( + bigIntArbitrary, + uintArbitrary, + bigIntStringArbitrary, + bigNumberArbitrary, + bytesArbitrary + ) + + describe('BigNumberishSchema', () => { + it('should parse BigNumberish', () => { + fc.assert( + fc.property(bigNumberishArbitrary, (bigNumberish) => { + expect(BigNumberishSchema.parse(bigNumberish)).toBe(bigNumberish) + }) + ) + }) + }) + + describe('BigNumberishBigintSchema', () => { + it('should parse BigNumberish into a bigint', () => { + fc.assert( + fc.property(bigNumberishArbitrary, (bigNumberish) => { + const parsed = BigNumberishBigintSchema.parse(bigNumberish) + + expect(typeof parsed).toBe('bigint') + expect(BigNumber.from(parsed)).toEqual(BigNumber.from(bigNumberish)) + }) + ) + }) + }) +})