Saldo de una dirección en función de una variable de tiempo

¿Hay alguna manera de comparar el saldo de una dirección en dos momentos diferentes o, en general, verificar el saldo de una dirección en un momento específico?

Me gustaría hacer algo como...

uint256 public startTime
address public exampleAddress

function exampleFunction () public constant returns (uint value) {
    if (balanceOf(exampleAddress) < balanceOf_atStartTime(exampleAddress)) {
        returns X;
    }
}

Mi entrada preferida sería una variable como la definida anteriormente, pero también sería adecuada una marca de tiempo de Unix o un evento.

¿Alguien sabe una manera de hacer este tipo de operación?

Muchas gracias por adelantado

Respuestas (2)

Respuesta corta: No, no puede obtener el saldo anterior de una dirección a través de Solidity. Pero hay una solución usando web3js.

Respuesta larga: podría hacer algo como esto para obtener el saldo de una dirección en un momento determinado, como se ve aquí: Obtener el historial de saldo de la dirección

con el siguiente código.

let blockNum = web3.eth.blockNumber;
const historicTimestamp = new Date(historicDate).getTime();
while(true) {
  const block = web3.eth.getBlock(blockNum);
  if(block.timestamp < historicTimestamp) break;
  --blockNum;
}

//The blockNumber here is your required block number
web3.eth.getBalance(address, blockNumber).then(balance => `Balance at block number is ${balance}`);

Luego, podría pasarlo a su contrato inteligente y comparar los dos saldos allí o compararlos en web3 por completo.

No creo que esto se pueda hacer desde el propio contrato inteligente.

La mejor apuesta que podría hacer es intentar usar el parámetro de número de bloque de web3 y estimar el número de bloque lo más cerca posible de la marca de tiempo deseada.