diff --git a/packages/web3/src/codec/contract-codec.test.ts b/packages/web3/src/codec/contract-codec.test.ts index 3c0bc8f76..459c9e951 100644 --- a/packages/web3/src/codec/contract-codec.test.ts +++ b/packages/web3/src/codec/contract-codec.test.ts @@ -35,6 +35,7 @@ import { LoadLocal, LoadMutField, Log5, + MethodSelector, Return, StoreLocal, StoreMutField, @@ -99,7 +100,7 @@ describe('Encode & decode contract', function () { argsLength: 0, localsLength: 0, returnLength: 1, - instrs: [LoadImmField(3), Return] + instrs: [MethodSelector(-1137803467), LoadImmField(3), Return] }, { isPublic: true, @@ -107,7 +108,7 @@ describe('Encode & decode contract', function () { argsLength: 0, localsLength: 0, returnLength: 1, - instrs: [LoadImmField(0), Return] + instrs: [MethodSelector(167928762), LoadImmField(0), Return] }, { isPublic: false, @@ -123,7 +124,7 @@ describe('Encode & decode contract', function () { argsLength: 0, localsLength: 0, returnLength: 1, - instrs: [LoadImmField(2), Return] + instrs: [MethodSelector(1051502534), LoadImmField(2), Return] } ] ) @@ -234,6 +235,7 @@ describe('Encode & decode contract', function () { localsLength: 9, returnLength: 0, instrs: [ + MethodSelector(-50171758), LoadLocal(0), LoadLocal(2), TokenRemaining, @@ -321,7 +323,7 @@ describe('Encode & decode contract', function () { const encoded = contractCodec.encode(decoded) const decodedContract = contractCodec.decodeContract(Buffer.from(contractBytecode, 'hex')) - expect(decodedContract.fieldLength).toEqual(methods.length) + expect(decodedContract.methods.length).toEqual(methods.length) expect(toHalfDecoded(decodedContract)).toEqual(decoded) decodedContract.methods.map((decodedMethod, index) => { expect(decodedMethod.isPublic).toEqual(methods[index].isPublic) diff --git a/packages/web3/src/codec/instr-codec.ts b/packages/web3/src/codec/instr-codec.ts index 9bca894ce..28307f890 100644 --- a/packages/web3/src/codec/instr-codec.ts +++ b/packages/web3/src/codec/instr-codec.ts @@ -22,6 +22,7 @@ import { compactUnsignedIntCodec, compactSignedIntCodec, DecodedCompactInt } fro import { ByteString, byteStringCodec } from './bytestring-codec' import { LockupScript, lockupScriptCodec } from './lockup-script-codec' import { Codec } from './codec' +import { signedIntCodec } from './signed-int-codec' const byteStringArrayCodec = new ArrayCodec(byteStringCodec) @@ -192,6 +193,7 @@ export const AddModN: Instr = { code: 0x88, value: {} } export const U256ToString: Instr = { code: 0x89, value: {} } export const I256ToString: Instr = { code: 0x8a, value: {} } export const BoolToString: Instr = { code: 0x8b, value: {} } +export const GroupOfAddress: Instr = { code: 0x8c, value: {} } export const LoadMutField = (index: number): Instr => ({ code: 0xa0, value: { index } }) export const StoreMutField = (index: number): Instr => ({ code: 0xa1, value: { index } }) export const ApproveAlph: Instr = { code: 0xa2, value: {} } @@ -246,6 +248,12 @@ export const CreateMapEntry: (immFields: number, mutFields: number) => Instr = ( immFields: number, mutFields: number ) => ({ code: 0xd2, value: { immFields, mutFields } }) +export const MethodSelector: (selector: number) => Instr = (selector: number) => { + return { code: 0xd3, value: { index: selector } } +} +export const CallExternalBySelector: (selector: number) => Instr = (selector: number) => { + return { code: 0xd4, value: { index: selector } } +} export class InstrCodec implements Codec { parser = Parser.start() @@ -393,6 +401,7 @@ export class InstrCodec implements Codec { [U256ToString.code]: Parser.start(), [I256ToString.code]: Parser.start(), [BoolToString.code]: Parser.start(), + [GroupOfAddress.code]: Parser.start(), 0xa0: Parser.start().uint8('index'), 0xa1: Parser.start().uint8('index'), [ApproveAlph.code]: Parser.start(), @@ -443,7 +452,9 @@ export class InstrCodec implements Codec { [LoadImmFieldByIndex.code]: Parser.start(), [PayGasFee.code]: Parser.start(), [MinimalContractDeposit.code]: Parser.start(), - 0xd2: Parser.start().uint8('immFields').uint8('mutFields') + 0xd2: Parser.start().uint8('immFields').uint8('mutFields'), + 0xd3: Parser.start().int32('index'), + 0xd4: Parser.start().int32('index') } }) @@ -465,6 +476,8 @@ export class InstrCodec implements Codec { } else if (instr.code === 0xd2) { const value = instrValue as CreateMapEntryValue result.push(value.immFields, value.mutFields) + } else if (instr.code === 0xd3 || instr.code === 0xd4) { + result.push(...signedIntCodec.encode((instrValue as InstrValueWithIndex).index)) } return Buffer.from(result)