import EVM from '../classes/evm.class' ; import Opcode from '../interfaces/opcode.interface' ; import * as BigNumber from '../../node_modules/big-integer' ; import stringify from '../utils/stringify' ; export class ADD { readonly name : string ; readonly wrapped : boolean ; readonly left : any ; readonly right : any ; constructor ( left , right ) { this . name = 'ADD' ; this . wrapped = true ; this . left = left ; this . right = right ; } toString ( ) { return stringify ( this . left ) + ' + ' + stringify ( this . right ) ; } get type ( ) { if ( this . left . type === this . right . type ) { return this . left . type ; } else if ( ! this . left . type && this . right . type ) { return this . right . type ; } else if ( ! this . right . type && this . left . type ) { return this . left . type ; } else { return false ; } } } export default ( opcode , state ) : void => { const left = state . stack . pop ( ) ; const right = state . stack . pop ( ) ; if ( BigNumber . isInstance ( left ) && BigNumber . isInstance ( right ) ) { state . stack . push ( left . add ( right ) ) ; } else if ( BigNumber . isInstance ( left ) && left . isZero ( ) ) { state . stack . push ( right ) ; } else if ( BigNumber . isInstance ( right ) && right . isZero ( ) ) { state . stack . push ( left ) ; } else { state . stack . push ( new ADD ( left , right ) ) ; } } ;