code: func (cw *contractWrapper) pushObject(vm *duktape.Context) {
  	obj := vm.PushObject()
  
  	// Push the wrapper for contract.Caller
  	vm.PushGoFunction(func(ctx *duktape.Context) int {
  		ptr := ctx.PushFixedBuffer(20)
  		copy(makeSlice(ptr, 20), cw.contract.Caller().Bytes())
  		return 1
  	})
  	vm.PutPropString(obj, "getCaller")
  
  	// Push the wrapper for contract.Address
  	vm.PushGoFunction(func(ctx *duktape.Context) int {
  		ptr := ctx.PushFixedBuffer(20)
  		copy(makeSlice(ptr, 20), cw.contract.Address().Bytes())
  		return 1
  	})
  	vm.PutPropString(obj, "getAddress")
  
  	// Push the wrapper for contract.Value
  	vm.PushGoFunction(func(ctx *duktape.Context) int {
  		pushBigInt(cw.contract.Value(), ctx)
  		return 1
  	})
  	vm.PutPropString(obj, "getValue")
  
  	// Push the wrapper for contract.Input
  	vm.PushGoFunction(func(ctx *duktape.Context) int {
  		blob := cw.contract.Input
  
  		ptr := ctx.PushFixedBuffer(len(blob))
  		copy(makeSlice(ptr, uint(len(blob))), blob)
  		return 1
  	})
  	vm.PutPropString(obj, "getInput")
  }
docs: // pushObject assembles a JSVM object wrapping a swappable contract and pushes it
  // onto the VM stack.