diff --git a/src/eosjs-api.ts b/src/eosjs-api.ts index 8fbbaaf93..541f8db83 100644 --- a/src/eosjs-api.ts +++ b/src/eosjs-api.ts @@ -99,6 +99,19 @@ export class Api { return this.abiTypes.get('abi_def').deserialize(buffer); } + /** Encodes a json abi as Uint8Array. */ + public jsonToRawAbi(jsonAbi: Abi): Uint8Array { + const buffer = new ser.SerialBuffer({ + textEncoder: this.textEncoder, + textDecoder: this.textDecoder, + }); + this.abiTypes.get('abi_def').serialize(buffer, jsonAbi); + if (!ser.supportedAbiVersion(buffer.getString())) { + throw new Error('Unsupported abi version'); + } + return buffer.asUint8Array(); + } + /** Get abi in both binary and structured forms. Fetch when needed. */ public async getCachedAbi(accountName: string, reload = false): Promise { if (!reload && this.cachedAbis.get(accountName)) { diff --git a/src/tests/eosjs-api.test.ts b/src/tests/eosjs-api.test.ts index a03173179..121750d4b 100644 --- a/src/tests/eosjs-api.test.ts +++ b/src/tests/eosjs-api.test.ts @@ -127,6 +127,7 @@ const deserializedActions = [ describe('eosjs-api', () => { let api: any; + let rpc: any; const fetch = async (input: any, init: any): Promise => ({ ok: true, json: async () => { @@ -142,7 +143,7 @@ describe('eosjs-api', () => { }); beforeEach(() => { - const rpc = new JsonRpc('', { fetch }); + rpc = new JsonRpc('', { fetch }); const signatureProvider = new JsSignatureProvider(['5JtUScZK2XEp3g9gh7F8bwtPTRAkASmNrrftmx4AxDKD5K4zDnr']); const chainId = '038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca'; api = new Api({ @@ -191,4 +192,32 @@ describe('eosjs-api', () => { expect(response).toEqual(true); }); + + it('rawAbiToJson returns correct Json from raw Abi', async () => { + const expected = await api.getAbi('testeostoken'); + const response = await rpc.getRawAbi('testeostoken'); + const actual = api.rawAbiToJson(response.abi); + + expect(actual).toEqual(expected); + }); + + it('jsonToRawAbi returns correct raw Abi from Json', async () => { + const response = await rpc.getRawAbi('testeostoken'); + const expected = response.abi; + const jsonAbi = await api.getAbi('testeostoken'); + const actual = api.jsonToRawAbi(jsonAbi); + + expect(actual).toEqual(expected); + }); + + it('confirms jsonToRawAbi and rawAbiToJson are reciprocal', async () => { + const expectedJsonAbi = await api.getAbi('testeostoken'); + const response = await rpc.getRawAbi('testeostoken'); + const expectedRawAbi = response.abi; + const jsonAbi = api.rawAbiToJson(api.jsonToRawAbi(expectedJsonAbi)); + const rawAbi = api.jsonToRawAbi(api.rawAbiToJson(expectedRawAbi)); + + expect(rawAbi).toEqual(expectedRawAbi); + expect(jsonAbi).toEqual(expectedJsonAbi); + }); });