diff --git a/avm-transpiler/src/transpile.rs b/avm-transpiler/src/transpile.rs index 6a6f67fe8fe0..11007c9497e7 100644 --- a/avm-transpiler/src/transpile.rs +++ b/avm-transpiler/src/transpile.rs @@ -981,7 +981,7 @@ fn handle_black_box_function(avm_instrs: &mut Vec, operation: &B avm_instrs.push(AvmInstruction { opcode: AvmOpcode::TORADIXLE, indirect: Some(FIRST_OPERAND_INDIRECT), - tag: Some(AvmTypeTag::FIELD), + tag: None, operands: vec![ AvmOperand::U32 { value: input_offset as u32, diff --git a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr index e71861ffbef9..ec3f070ec964 100644 --- a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr @@ -340,4 +340,10 @@ contract AvmTest { fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) { context.message_portal(recipient, content) } + + #[aztec(public-vm)] + fn to_radix_le(input: Field ) -> [u8; 10] { + let result: [u8] =input.to_le_radix(2, 10); + result.as_array() + } } diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index a18b4c05e43c..0181541b1ffc 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -879,6 +879,19 @@ describe('AVM simulator: transpiled Noir contracts', () => { expect(results.revertReason?.message).toEqual('Assertion failed: Values are not equal'); }); }); + it('conversions', async () => { + const calldata: Fr[] = [new Fr(0b1011101010100)]; + const context = initContext({ env: initExecutionEnvironment({ calldata }) }); + + const bytecode = getAvmTestContractBytecode('to_radix_le'); + const results = await new AvmSimulator(context).executeBytecode(bytecode); + + expect(results.reverted).toBe(false); + const expectedResults = '1011101010100'.split('').reverse().slice(0, 10).map(Number); + for (let i = 0; i < 10; i++) { + expect(results.output[i]).toEqual(new Fr(expectedResults[i])); + } + }); }); function getAvmTestContractBytecode(functionName: string): Buffer { diff --git a/yarn-project/simulator/src/avm/serialization/bytecode_serialization.ts b/yarn-project/simulator/src/avm/serialization/bytecode_serialization.ts index 0d2866ee9657..c6158e6bd763 100644 --- a/yarn-project/simulator/src/avm/serialization/bytecode_serialization.ts +++ b/yarn-project/simulator/src/avm/serialization/bytecode_serialization.ts @@ -1,4 +1,5 @@ import { DAGasLeft, L2GasLeft } from '../opcodes/context_getters.js'; +import { ToRadixLE } from '../opcodes/conversion.js'; import { Keccak, Pedersen, Poseidon2, Sha256 } from '../opcodes/hashing.js'; import type { Instruction } from '../opcodes/index.js'; import { @@ -136,6 +137,8 @@ const INSTRUCTION_SET = () => [Poseidon2.opcode, Poseidon2], [Sha256.opcode, Sha256], [Pedersen.opcode, Pedersen], + // Conversions + [ToRadixLE.opcode, ToRadixLE], ]); interface Serializable {