Estoy tratando de usar una función que devuelve un valor del contrato inteligente (pakoin).
contract Pacoin {
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
mapping (address => uint256) public vales;
string public name;
string public symbol;
uint8 public decimals;
address public pakos;
//Here some functions
function nPakoins() public constant returns (uint256 npakoins) {
npakoins = balanceOf[msg.sender];
}
function nVales() public constant returns (uint256 nvales) {
nvales = vales[msg.sender];
}
}
A pesar de intentarlo de diferentes formas, me dan muchos errores y no sé cómo solucionarlos.
BigInteger balance = pakoin.nPakoins(publicKeyUser).send();
Sin embargo, en lugar de devolver el valor, la aplicación se cierra repentinamente y tengo el siguiente error en la consola:
en clase Ljava/lang/reflect/Type; o sus superclases (la declaración de 'java.lang.reflect.Type' aparece en /system/framework/core-oj.jar) en org.web3j.abi.TypeReference.getClassType(TypeReference.java:54) en org.web3j .abi.FunctionReturnDecoder.build(FunctionReturnDecoder.java:99) en org.web3j.abi.FunctionReturnDecoder.decode(FunctionReturnDecoder.java:42) en org.web3j.tx.Contract.executeCall(Contract.java:159) en org. web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:165) en org.web3j.tx.Contract.executeCallSingleValueReturn(Contract.java:176) en org.web3j.tx.Contract.lambda$executeRemoteCallSingleValueReturn$1$Contract(Contract.java :232) en org.web3j.tx.Contract$$Lambda$1.call(Fuente desconocida) en org.web3j.protocol.core.RemoteCall.send(RemoteCall.java:30) en com.daedasan.sgssi_pakos.MainActivity$ReadTask .
P: ¿ Sabe cómo resolver este problema u otra forma de hacerlo? ¡Gracias de antemano!
Aquí está toda la clase.
public class MainActivity extends AppCompatActivity {
private final static String publicKeyUser = "0x4B5867c957a0950d4086172cA215Ac432b28b868";
private final static String privateKeyRinkeby = "***MyPrivateKey***";
private final static String greeterContractAddressRinkeby = "0x7a698A3072C01c4a9339ea929Cd2a241bED81937";
private final static String rinkebyUrl = "https://rinkeby.infura.io/hbvHwdGroO3GR4JQJvEl";
//private static final Logger log = LoggerFactory.getLogger(MainActivity.class);
private ProgressBar progressBar;
private ProgressBar progressBar2;
private EditText editText;
private TextView comprarTextView;
private TextView gasPriceTextView;
private TextView gasLimitTextView;
private SeekBar gasPriceSeekBar;
private Button botonNumPakoins;
private EditText nVales;
private Web3j web3j;
private Credentials credentials = Credentials.create(privateKeyRinkeby);
private int minimumGasLimit = 50000;
private BigInteger gasLimit = new BigInteger(String.valueOf(minimumGasLimit));
public MainActivity() throws IOException, CipherException {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUi();
setGasPriceText(10);
setGasLimit(minimumGasLimit);
initWeb3j();
}
private void initUi() {
progressBar = (ProgressBar) findViewById(R.id.progressbar);
progressBar2 = (ProgressBar) findViewById(R.id.progressBar2);
comprarTextView = (TextView) findViewById(R.id.ComprarText);
botonNumPakoins = (Button) findViewById(R.id.botonNPakoins);
nVales = (EditText) findViewById(R.id.NValesCanjear);
botonNumPakoins.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getNumPakoins();
}
});
gasPriceSeekBar = (SeekBar) findViewById(R.id.gas_price_seek_bar);
gasPriceSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
setGasPriceText(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
SeekBar gasLimitSeekBar = (SeekBar) findViewById(R.id.gas_limit_seek_bar);
gasLimitSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
setGasLimit(progress + minimumGasLimit);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
gasLimitTextView = (TextView) findViewById(R.id.gas_limit_text_view);
gasPriceTextView = (TextView) findViewById(R.id.gas_price_text_view);
}
private void writeGreetingToContract() {
progressBar.setVisibility(View.VISIBLE);
WriteTask writeTask = new WriteTask();
writeTask.execute(editText.getText().toString());
}
private void getNumPakoins(){
try {
progressBar.setVisibility(View.VISIBLE);
numPakoins numeroPakoins = new numPakoins();
numeroPakoins.execute();
} catch (Exception e) {
Log.d("wat", "getDiezBonosexception = " + e.getMessage());
}
}
private void initWeb3j() {
InitWeb3JTask task = new InitWeb3JTask();
task.execute(rinkebyUrl);
}
public void setGasPriceText(int gasPrice) {
String formattedString = getString(R.string.gas_price, String.valueOf(gasPrice));
gasPriceTextView.setText(formattedString);
}
private BigInteger getGasPrice() {
int gasPriceGwei = gasPriceSeekBar.getProgress();
BigInteger gasPriceWei = BigInteger.valueOf(gasPriceGwei + 1000000000L);
Log.d("wat", "getGasPrice: " + String.valueOf(gasPriceGwei));
return gasPriceWei;
}
public void setGasLimit(int gasLimit) {
String gl = String.valueOf(gasLimit);
this.gasLimit = new BigInteger(gl);
gasLimitTextView.setText(getString(R.string.gas_limit, gl));
}
private class numPakoins extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
String result;
try {
Pakoin pakoin = Pakoin.load(greeterContractAddressRinkeby, web3j, credentials, getGasPrice(), gasLimit);
BigInteger balance = pakoin.nPakoins(publicKeyUser).send();
result = balance.toString();
//result = transactionReceipt.getBlockHash();
} catch (Exception e) {
result = "Error reading the smart contract. Error: " + e.getMessage();
}
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressBar.setVisibility(View.INVISIBLE);
comprarTextView.setText(result);
}
}
private class InitWeb3JTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
String url = params[0];
HttpService infuraHttpService;
String result = "Success initializing web3j/infura";
try {
infuraHttpService = new HttpService(url);
web3j = Web3j.build(new HttpService(url));
} catch (Exception wtf) {
String exception = wtf.toString();
Log.d("wat", "Error initializing web3j/infura. Error: " + exception);
}
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
}
}
El problema puede ser causado por AsyncTask
. Intente llamar a su contrato desde el hilo principal para ver qué sucede. La posible solución es usar java.lang.Thread
.
Simón
alianse777
Simón
alianse777
Simón