solidity/solstdlib/src/precompiles.sol
2022-06-27 01:40:06 +02:00

39 lines
1003 B
Solidity

// SPDX-License-Identifier: Apache-2.0
function sha256(bytes memory input) returns (bytes32 ret) {
assembly {
let success := staticcall(gas(), 2, add(input, 32), mload(input), 0, 32)
if iszero(success) { revert(0, 0) }
ret := mload(0)
}
}
function ripemd160(bytes memory input) returns (bytes20 ret) {
assembly {
let success := staticcall(gas(), 3, add(input, 32), mload(input), 0, 32)
if iszero(success) { revert(0, 0) }
// TODO: check byteorder
ret := mload(0)
}
}
function ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address addr) {
assembly {
// Prepare input
// We are using the free memory pointer.
let input := mload(0x40)
mstore(input, hash)
mstore(add(input, 32), v)
mstore(add(input, 64), r)
mstore(add(input, 96), s)
// Prepare output
mstore(0, 0)
// Call the precompile
let ret := staticcall(gas(), 1, input, 128, 0, 32)
if iszero(ret) { revert(0, 0) }
addr := mload(0)
}
}