;;; fake_exponential(factor, numer, denom): integer approximation of ;;; factor * e ** (numer / denom), as specified in EIP-7002. ; [factor, numer, denom] dup3 ; [denom, factor, numer, denom] mul ; [accum, numer, denom] push 1 ; [i, accum, numer, denom] swap1 ; [accum, i, numer, denom] push 0 ; [output, accum, i, numer, denom] expo_loop: ;; while accum > 0 push 0 ; [0, output, accum, i, numer, denom] dup3 ; [accum, 0, output, accum, i, numer, denom] gt ; [accum > 0, output, accum, i, numer, denom] iszero ; [!(accum > 0), output, accum, i, numer, denom] jumpi @expo_done ; [output, accum, i, numer, denom] ;; output += accum dup2 ; [accum, output, accum, i, numer, denom] add ; [output, accum, i, numer, denom] ;; accum = (accum * numer) // (denom * i) swap1 ; [accum, output, i, numer, denom] dup4 ; [numer, accum, output, i, numer, denom] mul ; [accum*numer, output, i, numer, denom] dup5 ; [denom, accum*numer, output, i, numer, denom] dup4 ; [i, denom, accum*numer, output, i, numer, denom] mul ; [i*denom, accum*numer, output, i, numer, denom] swap1 ; [accum*numer, i*denom, output, i, numer, denom] div ; [accum, output, i, numer, denom] ;; i += 1 swap2 ; [i, output, accum, numer, denom] push 1 ; [1, i, output, accum, numer, denom] add ; [i, output, accum, numer, denom] swap2 ; [accum, output, i, numer, denom] swap1 ; [output, accum, i, numer, denom] jump @expo_loop expo_done: swap1 ; [accum, output, i, numer, denom] swap4 ; [denom, output, i, numer, accum] swap1 ; [output, denom, i, numer, accum] div ; [req_fee, i, numer, accum] swap3 ; [accum, i, numer, req_fee] pop ; [i, numer, req_fee] pop ; [numer, req_fee] pop ; [req_fee]