second-state / SOLL

SOLL is a new compiler for generate Ewasm from solidity and yul. See a demo here: https://asciinema.org/a/ezJqNLicn5fya02zwu4VXIo8a
https://www.secondstate.io/
378 stars 24 forks source link

Problem accessing solidity function from imported wasm binary in Javascript #126

Open Samboy76 opened 1 year ago

Samboy76 commented 1 year ago

Here´s the original solidity source code:

// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: %soll %s
contract HelloWorld {
   function sayHello() public pure returns (string) {
       return "Hello World";
   }
}

Javascript:

async function loadWasm() {
  const wasmBinary = fs.readFileSync('C:\\Samuel\\Blockchain\\Flashloan-arbitrage-bot-uniswapV2_hardhat_AAVE_flashloan\\artifacts\\helloWorld.wasm');

  const importObject = {
    ethereum: {
      finish: function() {
      }
    }
  };

  const instance = await WebAssembly.instantiate(wasmBinary, importObject);

  // Call the sayHello() function
  const result = instance.instance.exports.sayHello();
  console.log("Result:", result);
}
loadWasm();

Output:

Exported Functions and Objects: [ 'memory', 'main' ] module: Module [WebAssembly.Module] {} instance: [Function: 2] exports: Module [WebAssembly.Module] {}

C:\Samuel\Blockchain\Flashloan-arbitrage-bot-uniswapV2_hardhat_AAVE_flashloan\runarb.js:46 const result = instance.instance.exports.sayHello(); ^ TypeError: instance.instance.exports.sayHello is not a function

Would appreciate your help since I have followed the original steps guidance for solidity .sol compilation under README section. FYI there wasn´t any issue in generating the helloWorld.wasm object and can see hexadecimal byte codes inside the file which means the compilation process must have worked ok. Thank you!

hydai commented 1 year ago

SOLL follows the standard of EWASM. It will not export any public function defined by users to the export list. Instead, please use the EVM way to interact with the generated contracts.

Samboy76 commented 1 year ago

Thanks for the reply. So I gather it’s nothing wrong with the SOLL compilation to the binary object then? Is there an -debug option to soll command line that would spit out any possible compilation errors? Can you kindly adjust the above JavaScript code snippet to work in EVM way as I’m a newbie in this space and have already spent several days on it trying to get this to work effectively. Thanks again for your help.