in src/ristretto255.js [455:517]
function toBytes(h) {
/* h.X = h[0], h.Y = h[1], h.Z = h[2], h.T = h[3] */
const den1 = lowlevel.gf();
const den2 = lowlevel.gf();
let denInv = lowlevel.gf();
const eden = lowlevel.gf();
const invSqrt = lowlevel.gf();
const ix = lowlevel.gf();
const iy = lowlevel.gf();
const sVar = lowlevel.gf();
const tZInv = lowlevel.gf();
const u1 = lowlevel.gf();
const u2 = lowlevel.gf();
const u1U2U2 = lowlevel.gf();
let xVar = lowlevel.gf();
let yVar = lowlevel.gf();
const xZInv = lowlevel.gf();
const zInv = lowlevel.gf();
const zmy = lowlevel.gf();
let rotate = 0;
const s = new Uint8Array(32);
lowlevel.A(u1, h[2], h[1]); /* u1 = Z+Y */
lowlevel.Z(zmy, h[2], h[1]); /* zmy = Z-Y */
lowlevel.M(u1, u1, zmy); /* u1 = (Z+Y)*(Z-Y) */
lowlevel.M(u2, h[0], h[1]); /* u2 = X*Y */
lowlevel.S(u1U2U2, u2); /* u1U2U2 = u2^2 */
lowlevel.M(u1U2U2, u1, u1U2U2); /* u1U2U2 = u1*u2^2 */
sqrtRatioM1(invSqrt, gf1, u1U2U2);
lowlevel.M(den1, invSqrt, u1); /* den1 = invSqrt*u1 */
lowlevel.M(den2, invSqrt, u2); /* den2 = invSqrt*u2 */
lowlevel.M(zInv, den1, den2); /* z_inv = den1*den2 */
lowlevel.M(zInv, zInv, h[3]); /* z_inv = den1*den2*T */
lowlevel.M(ix, h[0], sqrtm1); /* ix = X*sqrt(-1) */
lowlevel.M(iy, h[1], sqrtm1); /* iy = Y*sqrt(-1) */
lowlevel.M(eden, den1, invsqrtamd); /* eden = den1*sqrt(a-d) */
lowlevel.M(tZInv, h[3], zInv); /* tZInv = T*z_inv */
rotate = isneg25519(tZInv);
xVar = lowlevel.gf(h[0]);
yVar = lowlevel.gf(h[1]);
denInv = lowlevel.gf(den2);
cmov25519(xVar, iy, rotate);
cmov25519(yVar, ix, rotate);
cmov25519(denInv, eden, rotate);
lowlevel.M(xZInv, xVar, zInv);
cneg25519(yVar, yVar, isneg25519(xZInv));
lowlevel.Z(sVar, h[2], yVar);
lowlevel.M(sVar, denInv, sVar);
abs25519(sVar, sVar);
lowlevel.pack25519(s, sVar);
return s;
}